const对象必须初始化,因为const对象一旦创建后其值就不能改变。
默认情况下,const对象仅在文件内有效
在一个文件中定义const,在多个文件中声明并使用,解决办法:对于const变量不管是声明还是定义都添加extern关键字。
把引用绑定到const对象上称为对常量的引用(reference to const),与普通引用不同的是,对常量的引用不能被用作修改他绑定的对象。
const int ci = 1024;
const int &r1 = c1;
r1 = 42; // error
int &r2 = ci; // error 不可以将将非常量引用指向一个常量对象
允许将const int &绑定到一个普通int对象上,即
int i = 1024;
int &r1 = i;
const int &r2 = i;
r1、r2同时绑定到普通int对象i上,可以通过i直接修改对象的值,也可以通过普通引用r1间接修改对象的值,但是不允许通过const引用r2修改i的值。
指向常量的指针也不能用于改变其所指对象的值。
const指针必须初始化,而且一旦初始化,它的值(也就是存储在指针中的那个地址)就不会改变了,也就是将一直指向此对象(即不变的是指针本身的值而不是指向的值)。
int errNumb = 0;
int *const curErr = &errNumb;
顶层const表示指针本身是一个常量,底层const表示指针所指对象是一个常量;靠右的const是顶层const,靠左的是底层const。
指针类型可以是顶层const也可以是底层const,所有引用都是底层const
int i = 0;
int *const p1 = &i; // 不允许修改p1的值,即p1的指向,是顶层const
const int ci = 42; // 不允许改变ci的值,是顶层const
const int *p2 = &ci; // 允许改变p2的值,即p2的指向,不允许通过p2修改ci的值。是底层const
const int *const p3 = p2; // 靠右的是顶层const,靠左的是底层const
const int &r = ci; // 用于声明引用的const都是底层const
当执行对象拷贝操作时,常量是顶层const还是底层const有很大区别,顶层const没有什么影响,拷贝操作不会改变被拷贝对象的值,拷入和拷出的对象是否是常量都没有什么影响。
i = ci;
p2 = p3;
底层const在执行拷入拷出时必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说非常量可以转换成常量,反之不可以。
int *p = p3; // error, p3具有底层const,即p3指向的值不可以修改,而p没有
p2 = p3; // 正确,p2和p3都是底层const
p2 = &i; // 正确,int*可以转成const int *
int &r = ci; // error, 普通的int &不能绑定到int常量上。
const int &r2 = i; // 正确,const int &可以绑定到普通int上。
**int const 和 const int 的区别
int a = 20;
int * const p1 = &a;
const int *p2 = &a;
p1表示一个指向int对象a的常量指针(类型为int *),p1的值不可以改变即无法指向其他的存储空间,但是其指向的存储空间的值可以通过*p1 = newvalue \ a = newvalue
改变。
p2表示一个指向const int对象a的指针,p2所指向存储空间的数值不可以通过*p2 = newvalue*
改变,但是可以通过a = newvalue
改变,并且p2也可以指向其他的存储空间。
常量表达式:指值不会改变并且在编译过程就能得到计算结果的表达式。
C++11新标准,允许将变量声明为constexpr类型以便编译器来验证变量值是否是常量表达式。声明为constexpr的变量一定是一个常量,并且必须用常量表达式初始化。
constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int sz = size(); // 只有当size是一个constexpr函数时才是一个正确的语句
算术类型、引用和指针都属于字面类型。自定义类、IO库、string类则不属于字面值类型,也不能被定义为constexpr。尽管指针和引用可以定义为constexpr,但是初始值却收到严格限制。一个constexpr指针的初始值必须为nullptr或0,或者是存储于某个固定位置中的对象。定义于所有函数体之外的全局对象其地址固定不变,能用来初始化constexpr指针。
在constexpr声明中若定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。
标签:p2,限定符,const,常量,int,constexpr,Primer,指针 From: https://www.cnblogs.com/happinesspills/p/16617519.html