概述
一、C++11 引入的nullptr
C语言中的NULL
- NULL用来标记空指针
- NULL在C和C++中的定义不同,因为C++不允许(void*)隐式转为(int*)等指针类型
- C++中也可以继续用NULL,但是因为函数重载的引入,NULL传参会带来歧义。比如2个重载函数:void func(int* a); 和 void func(char* c);
- C语言中NULL就是 (void*)0; C++语言中NULL就是0
NULL和nullptr的区别
- NULL是个宏定义,而nullptr是个关键字
- NULL本质是一个数字0,而nullptr本质是一个指针类型
- nullptr就是一个可以绕过C++严格的类型检查的NULL,就是因为C++不允许int* p = (void*)0 这样,所以才有了nullptr
nullptr如何工作
- nullptr传参,表示真正的空指针
- 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的评价
- C++11 开始使用,
- 实践中在判断野指针时很多人还是喜欢使用 if(!p) ,历史遗留原因…
- nullptr无法解决 (char* p) 和 (int* p) 这样的传参重载问题,所以还是有点不完美
- 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
- 直接参考: https://www.cnblogs.com/lvchaoshun/p/7816288.html
- C的assert是运行时检测发现错误,而不是编译时
- C在编译时错误用#error来输出
- stm32开发中,库函数常用到assert来判断用户调用接口时的传参是否符合要求
C++静态断言
- C++引入static_assert(表达式,“提示字符串”)来实现编译时的静态断言
- static_assert 主要用于检查模板参数是否符合期望
- 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空指针、静态断言所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复