一、关于const的疑问
1.const常量的判别准则 --- 只用用字面量初始化的const常量才会进入符号表 --- 使用其它变量初始化的const常量仍然是只读变量 --- 被volatile修饰的const的常量不会进入符号表,只是的得到一个只读变量,而这个只读变量不能出现在赋值符号的左边 注意:在编译期间不能直接确定初始值的const标识符,都被作为只读变量处理 2.const引用的类型与初始化变量的类型 --相同:初始化变量称为只读变量 --不同:生成一个新的只读变量#include二、引用与指针的关系 1.指针是一个变量 --值为一个内存地址,不需要初始化,可以保存不同的地址 --通过指针可以访问对应内存地址中的值 --指针被const修饰称为常量或者只读变量 2.引用只是一个变量的新名字 --对引用的 *** 作(赋值,取地址等)等会传递到代表的变量上 --const引用使其代表的变量具有只读属性 --引用必须在定义时初始化,之后无法代表其它变量 3.从使用C++语言的角度看 -- 引用与指针没有任何关系 --引用是变量的新名字, *** 作引用就是 *** 作对应的变量 4.从C++编译器的角度看 -- 在编译器内部,使用指针常量来实现“引用” --因此 “引用”在定义时必须初始化 5.c++中不支持引用数组int main() { const int x=1; //x进入符号表 const int& rx=x; //rx为只读变量,内存空间由编译器为x分配的 int& nrx =const_cast (rx); // 去掉rx的只读属性 nrx=5; printf(" x = %dn",x); printf(" rx =%dn",rx); printf("nrx = %dn",nrx); printf(" &x = %pn",&x); printf(" &rx =%pn",&rx); printf("&nrx = %pn",&nrx); volatile const int y =2; //只读变量而不是常量 int* p =const_cast (&y); *p =6; printf(" y = %dn",y); printf(" &y = %pn",&y); const int z=y; //y 只是一个变量,所以z也是只读变量 p =const_cast (&z); *p =7; printf(" z = %dn",z); printf(" &p = %pn",&p); char c ='c'; char& rc =c; const int& trc = c; rc='a'; printf(" c = %cn",c); printf(" rc = %cn",rc); printf(" trc = %cn",trc); //const引用初始变量类型不同,将产生一个新的只读变量 return 0; }
#includeint a =1; struct SV { int &x; int &y; int &z; }; int main() { int b=2; int* pc = new int(3); // //&array[1] - &array[0] = ? 期望是4,实际地址差异很大 //int& array[]={a,b,*pc}; //报错,因为数组中的每个元素是顺序存放的 SV sv={a,b,*pc}; printf("&sv.x = %pn",&sv.x); printf("&sv.y = %pn",&sv.y); printf("&sv.z = %pn",&sv.z); delete pc; return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)