常量表达式
值不会改变并且在编译过程就能得到计算结果的表达式。
一个对象(表达式)是否是常量表达式由它的数据类型和初始值共同决定。
限定符const
限制变量的值不被改变
//希望变量的值不被改变
const int consta = 0;
const double constc = 0.0;
const int &referencea_to_consta = consta;
声明符constexpr
/*
常量表达式(const expression)
1.值不会改变
2.编译过程中就能得到计算结果的表达式
*/
//只要认定变量是常量表达式,就可以把它声明为constexpr类型
int globalscalar = 0;
extern const int constb = 0;
int main(int argc, char **argv){
int scalara = 0;
constexpr int constd = 0;
constexpr int *constexprpointera = &globalscalar; //constexprpointera 是一个指向整数的常量指针
//非法:constexpr int *constexprpointerb = &scalara;//编译过程中无法得到scalara的地址
return 0;
}
const与引用(reference)
//当一个常量引用(对const的引用)绑定到另一种类型时
const double constc = 0.0;
const int &referenceb_to_constc = constc;//实际上,const int temp = scalarb; const int &referenceb_to_scalarb = temp;
//非法:int &referencec_to_constc = constc;
//常量引用仅对引用可参与的操作作出限制,而对引用的对象本身是不是常量未作出限制
int scalara = 0;
const int &referenced_to_scalara = scalara;
scalara = 1;
//非法:referenced_to_scalara = 1;
const与指针(pointer)
const int consta = 0;
int scalara = 0, scalarb = 0;
extern const int constb;
//指向常量的指针:仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变
const int *pointerc_to_consta = &consta;
const int *pointerd_to_scalara = &scalara;
//常量指针(const pointer):指针是对象,允许把指针本身定为常量
int *const constpointera_to_scalara = &scalara;
//不允许改变的是指针本身的值,而不是指向的那个值
// 非法:constpointera_to_scalara = &scalarb;
*constpointera_to_scalara = 2;
pointerc_to_consta = &constb;//对比指向常量的指针
拷贝const
//顶层const(top-level const):任意对象本身是常量
const int consta = 0;
int *const constpointera_to_scalara = &scalara;
//底层const(low-level const):指针(引用)所指对象是常量
const int *pointerc_to_consta = &consta;
//在拷贝时,要求两者具有相同的low-level const资格
//非法: pointa = &consta;
const int *pointerc_to_constb = &consta;//合法
关于c++不允许 ‘A**’ to ‘const A**’
class A{};
void f(const A** p){}
int main(int argc, char **argv){
int scalara = 0, *pointa = 0;
int *pointer_to_var = &scalara;
int ** pointer_to_pointer_to_scalar = &pointa;
const int ** pointera_to_pointer_to_const = pointer_to_pointer_to_scalar;
int ** pointer_to_pointer_to_var = &pointer_to_var;
const int ** pointerb_to_pointer_to_const = pointer_to_pointer_to_var;
A *a = new A();
A ** pointer_to_pointer_to_class = &a;
const A** pointer_to_pointer_to_constclass = pointer_to_pointer_to_class;
f(pointer_to_pointer_to_class);
const A *b = new A();
f(&b);
}
得到的编译结果是
有点疑惑,const限制的是A,个人理解是底层const,应该是允许的,期待大佬们的解疑。
常量成员函数(const member function)
构造函数不能声明为const