我是靠谱客的博主 含蓄冰棍,最近开发中收集的这篇文章主要介绍C++学习笔记6 - nullptr空指针、静态断言,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、C++11 引入的nullptr

C语言中的NULL

  1. NULL用来标记空指针
  2. NULL在C和C++中的定义不同,因为C++不允许(void*)隐式转为(int*)等指针类型
  3. C++中也可以继续用NULL,但是因为函数重载的引入,NULL传参会带来歧义。比如2个重载函数:void func(int* a); 和 void func(char* c);
  4. C语言中NULL就是 (void*)0; C++语言中NULL就是0

NULL和nullptr的区别

  1. NULL是个宏定义,而nullptr是个关键字
  2. NULL本质是一个数字0,而nullptr本质是一个指针类型
  3. nullptr就是一个可以绕过C++严格的类型检查的NULL,就是因为C++不允许int* p = (void*)0 这样,所以才有了nullptr

nullptr如何工作

  1. nullptr传参,表示真正的空指针
  2. nullptr的本质:
    const class nullptr_t{ public: template<class T> inline operator T*()const {return 0;} template<class C, class T> inline operator T C::*() const {return 0;} private: void operator&() const; } nullptr={};

nullptr的评价

  1. C++11 开始使用,
  2. 实践中在判断野指针时很多人还是喜欢使用 if(!p) ,历史遗留原因…
  3. nullptr无法解决 (char* p) 和 (int* p) 这样的传参重载问题,所以还是有点不完美
  4. nullptr不属于任何一种对象指针,但是却可以表示任何类型的空指针

nullptr使用demo

#include <iostream>

using namespace std;

int main(void)
{
	int a;
	char *p = nullptr;
	
	p = (char *)&a;
	if (nullptr != p)
	{
		cout << "p not nullptr" << endl;
	}
	return 0;
}

二、静态断言

C中的断言assert

  1. 直接参考: https://www.cnblogs.com/lvchaoshun/p/7816288.html
  2. C的assert是运行时检测发现错误,而不是编译时
  3. C在编译时错误用#error来输出
  4. stm32开发中,库函数常用到assert来判断用户调用接口时的传参是否符合要求

C++静态断言

  1. C++引入static_assert(表达式,“提示字符串”)来实现编译时的静态断言
  2. static_assert 主要用于检查模板参数是否符合期望
  3. C++20 中引入了concept来进一步更好的实现模板参数的编译时类型匹配检查

static_assert 静态断言 demo

#include <iostream>

using namespace std;

// 前提:我写了一个项目只能运行在32位系统上,我要防止用户在64位系统上运行该程序
int main(void)
{
	static_assert((sizeof(void *) == 4), "not support non 32bit system");
	
	return 0;
}

最后

以上就是含蓄冰棍为你收集整理的C++学习笔记6 - nullptr空指针、静态断言的全部内容,希望文章能够帮你解决C++学习笔记6 - nullptr空指针、静态断言所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部