一、const变量在C语言和c++中的区别
//在C语言中以变量为主
const int n=10;
int ar[n]={1,2};//在这里会报错,认为n是变量
//在c++中以常量为主
const int n=10;
int ar[n]={1,2};//OK,在这里认为n是常量
在c++中,汇编的过程会将所遇到的常量更换为其代表的值,即ar[n]==>ar[10];
二、const与指针的关系
int main()
{
int a=10,b=10;
int *p1=&a; //普通指针
const int *p2=&a; //指向为常性,即解引用为常性 int const *p2=&a;两者代表一样
int *const p3=&a; //指针变量自身为常性
const int * const p4=&a; //指向(解引用)和指针变量自身都为常性
}
1.常变量与指针的关系
int main()
{
const int a=10; //常量a
int *p1=&a; //err *p1可以改变,会使a的值改变,与常量a不符
const int *p2=&a; //ok *p2不可以改变,即指向不可改,但指针自身可以改变
int *const p3=&a; //err *p3可以改变,会使a的值改变,与常量a不符,但指针自身不可改
const int *const p4=&a; //ok 指向不可改,指针自身也不可改
int *p5 = (int *)&a; //ok (int*)为强转,此方法虽可行,但不安全
int *p5=reinpreter_cast<int *>(&a); //去常,去掉a的常性
//去常与强转相比,强转更加好一些
return 0;
}
注意:
1.全局变量未初始化为0,局部变量未初始化未随机值
2.const全局变量和局部变量都必须初始化,const结构体初始化时,全局的为0,局部的为随机值
3.const int *p;//可以编译通过,因为在此时是指向不可改,不牵扯指针变量自身
int *const sp;//不可以编译通过,此时指针变量自身不可改,故必须进行定义
2.兼容规程
能力强的指针赋值给能力收缩的指针
int a=10;
int *p=&a;
const int *s1=p;
int *const s2=p;
const int *const s3=p;
三、const引用
const引用(万能引用),可以引用左值,也可以引用右值
int main()
{
int a=10;
const int b=20;//b为常性值,只读不写
int &x=b; //x可读可写
const int &x=b;
const int &y=a;
const int &z=10;
return 0;
}
四、const与this指针
在类中,只要声明过的对象,都会加入this指针
CGoods * const this //加入const为防止this指针置nullptr