关于const
-
const的值在初始化后,是不能随意改变的,不然会引发编译器报错
-
const对象必须初始化
-
使用一个普通变量区初始化const变量,这种操作是可以的
int i = 42; const int ci = i; int j = ci;
-
常量的特征仅仅在执行改变常量的操作时才会发挥作用
-
默认情况下,const仅在定义的文件内有效,如果你想多个文件使用同一个const,就用extern关键字
extern const int bufSize = fcn(); //在file.c定义并初始化的常量 extern const int bufSize; //file.h中这么写,其实这个和file.c中定义的是同一个buffSize
-
引用和被绑定对象类型不同时,编译器会创建一个临时变量,来作为中间值
/*这样写的话,编译器会产生一个临时变量*/ double dval = 3.14; const int &ri = dval; /*会演变为*/ double dval = 3.14; const int temp = dval; const int &ri = temp; /*正常来说,引用和被绑定的对象,地址应该是一样的,但是这里,就会导致ri和temp的地址打印出来时不一样的*/
-
常量引用,对于引用的对象本身是不是一个常量未做限定
-
指向常量的指针也没有规定其所指的对象必须是一个常量
-
⭐️不允许通过常量引用、指向常量的指针改变引用对象的值
-
⭐️常量指针和指向常量的指针
-
常量指针:它里面里面存放的地址是不能变的,但是那个地址指向的值可以变(地址固定,值可变)
-
指向常量的指针:
-
不能改变这个指针所指对象的值,但是这个指针是可以改的。(值固定(就是不能通过这个指针改变指向对象的值,而这个对象只要类型符合,是可以换的),地址可变)
-
指向常量的指针,允许指向一个非常量对象
-
const double pi = 3.14; // double * ptr = π const double *cptr = π cout << "pi 地址 = " << &pi << endl; cout << "cptr 地址 = " << &cptr << endl; cout << "cptr 值 = " << cptr << endl; cout << "cptr 所存地址里的值 = " << *cptr << endl; cout << '\n' << endl; // *cptr = 42; double dval = 5.96; cptr = &dval; cout << "dval 地址 = " << &dval << endl; cout << "cptr 地址 = " << &cptr << endl; cout << "cptr 值 = " << cptr << endl; cout << "cptr 所存地址里的值 = " << *cptr << endl; /*对应的输出为*/ pi 地址 = 0x61ff08 cptr 地址 = 0x61ff04 cptr 值 = 0x61ff08 cptr 所存地址里的值 = 3.14 dval 地址 = 0x61fef8 cptr 地址 = 0x61ff04 cptr 值 = 0x61fef8 cptr 所存地址里的值 = 5.96
-
-
-
顶层const和底层const
- 顶层const:指针本身是const(常量指针)
- 底层const:指针所指的对象是常量(指向常量的指针)