- 顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量。更一般的,顶层const可以表示任意的对象是常量,底层const则与指针和引用等复合类型的基本类型部分有关。
- 用于声明引用的const都是底层const。
- 当执行对象的拷贝操作时,常量是顶层const还是底层const区别明显。其中顶层const不受什么影响;对于底层const来说,当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const风格,或者两个对象的数据类型必须能够转换,一般来说,非常量可以转换成常量,反之不行。
int i=0;
int *const p1=&i;//顶层
const int c1=42;//顶层
const int *p2=&c1;//底层
const int *const p3=p2//都有
const int &r=c1;//底层
i=c1;//正确
p2=p3;//正确
int *p=p3;//错误
p2=p3;//正确
p2=&i;//正确
int &r=c1;//错误
const int &r2=i;//正确 - constexpr和常量表达式是指不会改变并且在编译过程就能得到计算结果的表达式。C++11规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf=20;
constexpr int limit=mf+1;
constexpr int sz=size();//只有当size是一个constexpr函数时才正确 - 尽管指针和引用都能定义成constexpr,但他们的初始值却受到严格限制。一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。
- constexpr指针不能指向函数体内定义的变量,可以指向函数体外的对象。
- 在constexpr声明中如果定义一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关
const int *p=nullptr;//p是一个指向整型常量的指针
constexpr int *q;//q是一个指向整数的常量指针
constexpr把它所定义的对象置为了顶层const。
constexpr int i=42;
constexpr const int *p=&i;//p是常量指针,指向整型常量i
int j=0;
constexpr int *p1=&j;//p1是常量指针,指向整数j
const限定符(二)
最新推荐文章于 2022-02-28 15:12:09 发布