1.const 限定符
??const关键字的主要作用主要在于限定一个变量的值不被改变。
??如:用一个变量来表示缓冲区的大小。
const int bufSize = 1024;
默认情况下,const对象仅在文件内有效,如果只在一个文件中定义const,需要在其它的文件中对其声明并使用它。其解决方法就是:对于const变量不管声明还是定义都添加 extern关键字,这样就只需要定义一次就够了。
2.const 的引用
??可以把引用绑定到 const 对象上,就像绑定到其他对象上一样,我们称之为对常量的引用,如:
int i = 10;
const int &r1 = i;
const int &r2 = 42;
指针和 const
??与引用一样,也可以令指针指向常量或非常量,如:
int i = 10;
const int *ptr = &i;s
??和常量引用一样,指向常量的s指针也没有规定其所指的对象必须是一个常量。
??指针是对象,引用则不是,因此和其它对象类型一样,允许将指针本身定义为常量,常量指针必须初始化,一旦初始化,则它的值(这指的是存放指针的地址)就不能改变了。将 * 放在const关键字之前用以说明指针是一个常量。
示例:
int a = 10;
int *const ptr1 = &a;
顶层 const 和底层 const
??顶层const指的是指针变量本身是一个常量,底层const指的是指针所指的对象是一个常量。
constexpr 和常量表达式
&emsp?常量表达式是指值不会变并且在编译过程就能得到计算结果的表达式。
constexpr 变量
C++11规定,允许将变量声明为 constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须使用常量表达式初始化,如:
cosntexpr int a = 20;
constexpr int b = a + 1;
??普通函数不能作为 constexpr 变量的初始值,但新标准允许定义一种特殊的 constexpr函数,这种函数应该足够简单以使用。
??指针和引用都能够定义为constexpr,但它们的初始值却受到严格限制,一个constexpr指针的初始值必须为nullptr或0或者存储在某个固定地址中的对象,允许函数定义一类有效范围超出函数本身的变量,这类变量和定义在函数体之外的变量一样有固定地址。constexpr引用能够绑定这样的对象,const指针也能指向这样的变量。
NOTE:在constexpr声明中如果定义了一个指针,限定符 constexpr仅对指针有效,与指针所指的对象无关。
|