文章目录
const 限定常量
eg.
const int con = 1024;
定义一个 int 型的常量
变量con的值,不可改变
赋值一个函数
const int con = func();
声明连续变量
const 声明连续变量时,都有效
const int con1=1, con2=2, con3=3;
con1、con2、con3 都是常量
const 与引用 const type &
指向常量的 常量引用,本身也必须是一个常量。
该引用变量不能被改变。
const int con1 = 1024;
const int &con2 = con1; //对常量的引用,简称常量引用,也必须是一个常量
const int &con3 = 1024; //常量引用,可以赋上一个字面值。而非常量引用是不行的
int cVal = 1;
const int &con4 = cVal; //常量引用,可以赋值一个非常量的变量
注意,con4,被赋值上一个非常量值。con4本身不能被改变,但指向的非常量值是可变的。修改非常量值:
cVal = 197;
cout << con4 << endl;
会输出 197
指向常量的常量引用,本身也必须是一个常量
指向非常量的常量引用,非常量值改变,引用值也改变
不能通过自身去改变指向的值
const 与指针
常量指针: const type *
常量指针,本质上是一个指针。声明定义:先常量符const ,后跟类型指针。
指向常量的指针,本身也必须是一个常量。
但是,指针变量本身可以被重新赋值。
const int con1 = 1024;
const int *con2 = &con1; //指向常量的指针
int cVal = 1;
const int *con3 = &cVal; //指向非常量的指针
int cVal2 = 197;
con2 = con3 = &cVal2;
cout << *con2 << endl;
cout << *con3 << endl;
如上,形如 const type *
定义的变量,无论指向的是一个常量,还是非常量。都可以重新指定指向的地址。
通过 指针解引用符来改变 指向的原始值,是不行的。 *con3 = 200;//error
指针常量: type *const
指针常量。本质是一个常量,该常量是一个指针类型。声明定义:先类型指针,后跟常量符const。
定义时,必须初始化。因该指针是一个常量,所以就无法被重新赋值,会一直指向初始值地址。
int con1 = 1024;
int *const con2 = &con1; //常量指针
int cVal = 1;
*con2 = 10;
con2 = &cVal; //error
如上,con2的地址无法被改变,但地址指向的值是可变的。
指针本身不可变,且地址指向的值也不可变: const type *const
综合上面两种定义,
int con1 = 1024;
const int *const con2 = &con1;
int cVal = 1;
*con2 = 10; //error
con2 = &cVal; //error
如上, con2的地址无法被改变,且地址指向的值也不可变。
顶层 const 和 底层 const
顶层 const (top-level const) 表示本身是一个常量
底层 const (low-level const) 表示指向的是一个常量
通俗的讲,
顶层 const,即(指针或引用或其它类型)变量本身不可变;
底层 const,即(指针或引用或其它类型)变量所指向的对象值不可变。
对于指针来说:
type * const 是顶层的;
const type * 是底层的。
对于引用来说:
const type & 是底层的。(这个规定,让我也很诧异。明明可以指向常量和非常量,且通过常量引用变量,无法改变本身,也无法改变引用的对象值。只能说,这是一个死规定)
既是顶层也是底层 const:
const int *const ccp = &cv;//左边是 low const,右边是 top const;
cpp11: constexpr 常量表达式
cpp11 新增关键字constexpr
,可用于声明常量,和常量函数。
constexpr int rv() {
return 100;
}
constexpr int xd = 88;
constexpr int xxd = rv();
使编译器在编译期间验证,常量定义是否正确。
由于在编译期间要确定常量值,所以非基本类型不可用于 常量表达式。像是指针类型 就是不行的