标签:
格式:基本数据类型+声明符(&d)= 对象;其中d是声明的变量名;
eg. int ival = 1024;
int &refVal = ival;
与引用的不同之处:
不能直接操作void*指针所指的对象;
作用:与别的指针比较、作为函数的输出或输入?
eg. int *&r = p; //从右向左读r的定义,离变量名最近的符号为&,所以r为引用
// 符号*说明r引用的是一个指针
两者共同作用:不能改变被绑定对象的值;
一般的用例:const int ci = 1024; const int &r1 = ci;//普通的用法
特殊的用例:const int &ri = (非常量的对象、字面值、表达式);
//此时,ri 绑定了一个临时量对象
编译器将其等价于
????????????????Const int temp = (非常量的对象、字面值、表达式);
????????????????Const &ri = temp;
double *const ptr = π//ptr是一个常量指针
ptr = &pi1; //错误,const限制了指针的指向操作;
*ptr = 3.1;????????//正确,ptr指向对象的操作正常
?
*ptr = 3.1; //错误,const限制了指针指向对象的操作
Ptr = &pi1; //正确,ptr可以指向其他对象
*ptr = 3.1; //错误
Ptr = &pi1; //错误
?
//low-level and top level
????int i = 0;
????int *const p1 = &i; //顶层const
????const int ci = 42;???????? //顶层const
????const int *p2 = &ci;???? //底层const
????const int *const p3 = p2; //左边一个const为顶层const,右边一个为底层cosnt
???? const int &r = ci;???????? //凡是用于声明引用的const都是底层const
?
判断初始值是不是常量表达式很麻烦,,所以引入constexpr 类型,让编译器来验证变量值石头是一个常量表达式。
什么的类型能可以被定义为constexpr?——字面值类型(指针、引用、算术类型)
定义后的constexpr初始值
标签:
原文地址:http://www.cnblogs.com/linj2n/p/5371529.html