笔记:C++类型检查增强( const、指针规范、nullptr)
1、const
在C语言中定义了const类型:
const int a = 5;
a = 100;
error C2166: 左值指定 const 对象
const int a 不能作为左值而被赋值,然而在C中const类型的值真的不能修改了吗?
#include<stdio.h>
int main()
{
const int a = 5;
int *p = &a;
*p = 100;
printf("a = %d",a);
return 0;
}
结果:
a = 100;
可见,C中的const类型可以用指针修改,并不是真正的const
如果上面这段代码出现在C++中那么编译器会报错:试图将 const int* 型赋给 int * 型
若改正,则只需将 int *p 改为 const int *p (意思为(*p)的值不能改变(指针p的值可以改变)与 int * const p 有区别)
在C++中,此时的 const 才是真正的const
如指针、引用之类的都不能改变const的值(编译器会报错),这样就能在编译的时候检测出更多的错误,减少调试的工作量
2、指针规范
#include<stdio.h>
int main()
{
int i;
int arr[2][4]={{1,2,3,4},
{5,6,7,8}};
int *p = arr;
p++;
for(i =0 ;i <4;i ++)
printf("%d",p[i]);
return 0;
}
结果:
2345
上面的代码放到C++中会报错:将 int *[4]转换为 int * ;
如果你想要的结果是:5678,那这个 p 显然不是你想要的 p
错误的原因是:数组与指针的类型区别没有弄明白(其实 arr 的数据类型为 int (*)[4])
需出如下修改:
int (*p)[4] = arr;
p++;
for(i =0 ;i <4;i ++)
printf("%d",(*p)[i]);
可见C++增强了对类型的检查
3、nullptr
在C库中,有#define NULL 0
让指针为空可以写为:p = 0; 或 p = NULL;
在C++中开放了重载的功能,于是就有了一下的情况:
#include<iostream>
void func(int *){cout<<"NULL";}
void func(int){cout<<"0";}
int main()
{
func(NULL);func(0);
return 0;
}
结果:
00
函数的调用并没有出问题,因为宏替换就是把NULL换成0
那你说我要调用第一个函数怎么办呢,这里C++定义了一个关键字:nullptr
将 nullptr 取代NULL即可调用,在C++中空指针一律用nullptr赋值