const 限定符
1.const对象必须初始化
1)表达式初始化
const int i = getSize(); //运行时进行初始化
2)常量初始化
const int j = 43; //编译时进行初始化
3)对象处初始化
int i = 43;
const int id =i;
2.限制:只能在const类型的对象上执行不改变其内容操作。
3.可以拷贝,用ci初始化j,无需在意ci是否为常量。拷贝一个对象的值并不会改变它,完成拷贝后,新对象j与原来对象ci没有任何关系。
const int ci =3;
int j = ci;
4.默认状态,const对象仅在文件内有效,若存在多个文件:
1)每个文件均进行定义。多个文件出现同名const变量,等同于不同文件中分别定义独立变量。
2)const变量不管声明还是定义都添加extern关键字,如
//file.c定义并初始化了而一个常量,该常量能被其他文件访问
extern const int buff = fcn();//初始化了buff,此语句为定义。
//file.h头文件
extern const int buff;//与file.c中定义的buff是同一个。此语句为声明。
对const的引用,即对常量的引用(简称常量引用)const int &r2 =2;
1.普通引用的类型必须与所引用对象的类型一致,只能绑定在对象上。但是对于常量引用,符合前述条件之外,还允许将其绑定非常量的对象、字面值,以及表达式。
int &r1 = 0; //普通引用r1未绑定在对象上(错误)
2.正确:引用及其对象都是常量,不可修改ci的值,也不可通过r1修改ci的值
const int ci = 10;
const int&r1 = ci;
3.错误:试图让一个非常量引用指向一个常量对象
const intci = 10;
int &r1 = ci;
4.常量引用仅对引用可参与的操作作出限定,对引用的对象本身是否为常量未作限定。不能通过常量引用修改对象的值。
int i = 42;
int &r1 = i; //普通引用r1绑定对象i;
const int&r2 = i; //常量引用绑定对象i;
r1 = 0; //普通引用r1,作为i的别名,可修改i的值,为0
r2 = 0; //常量引用r2,作为i的别名,不可修改i的值(错误)
不允许r2修改i得到值,但可以通过i或者r1修改该对象的值。
指针和const
[1]指向常量的指针const double *pi = 3.14;
1.不能用于改变其所指对象的值
2.错误:试图让一个普通指针指向一个常量
const double pi = 3.14;
double *p = π
3.不能给指向常量的指针赋值
4.普通指针的类型必须与其所指对象的类型一致。在指向常量的指针中,符合前述条件之外,还允许令一个指向常量的指针指向一个非常量对象。要求不能通过该指针改变对象的值,但可通过其他途径改变对象的值(如对const的引用中第4点)
[2]const指针double * const pi = 3.14;
1.必须初始化,一旦初始化后,其值(存放在指针中的地址)不可再改变,即不变的是指针本身的值而非指向的那个值
2.正确:允许一个const指针指向非常量
int errNumb = 0;
int *constcurErr = &errNumb;
顶层const &底层const 理解上述内容
1.顶层const
表示任意对象本身就是常量,对任何数据类型都适用,如指针常量。
2.底层const
表示所指对象时一个常量,如指向常量的指针。
int i = 0;
int *const p1 = &i; //不能改变p1的值,顶层const
const int ci =42; //不能改变ci的值,顶层const
const int *p2 = &ci; //允许改变p2的值,底层const
const int *constp3 = p2; //靠右的const是顶层const,靠左的是底层const
const int &r = ci; //用于声明引用的const都是底层const
3.用于声明引用的const都是底层const
4.初始化时,
1)左值为非const,右值为非const或者顶层const。
2)左值为顶层const,右值为非const、顶层const(常量指针指向常量对象除外)
3)左值含有底层const(底层const、顶层const&底层const),右值为非const、顶层const、含有底层const(底层const、顶层const&底层const)。
4)常量指针不可指向常量对象,但可用指向常量的常量指针指向常量对象
5.当执行对象进行拷贝操作时,顶层const与底层const存在区别:
1)顶层const无影响;
2)底层const有限制,拷入拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说,非常量可以转换成常量。赋值”=”,左侧为左值,右侧为右值。
对象进行拷贝操作总结:
1)左值为非const,右值为非const或者顶层const。
2)左值为顶层const,不能给左值赋值,因为顶层const是不可改变本身的常量。
3)左值为底层const,可以对其进行赋值拷贝,右值可为非const、顶层const或者具有相同的底层const资格。