c++中const
const限定符主要的限制就是智能在const类型的对象上执行不改变其内容的操作。默认情况下,const对象仅在文件内有效。如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字。
1、const的引用
对常量的引用:将引用绑定在const对象上。——与普通引用不同的是,对常量的引用不能被用作修改他所绑定的对象。
const int ci = 1024;
const int &ri = ci;//引用及其对应的对象都是常量
ri = 42;//错误:因为ri是对常量的引用,不能更改他的值
int &r2 = ci;//错误:因为r2是非常量引用,不能指向常量对象——因为引用类型必须与所引用对象类型一致
对const的引用可能引用一个并非const的对象
int i = 42;
int &r1 = i;
const int &r2 = i;//正确:常量引用绑定在非常量i上,可行。只是无法实现通过更改r2来实现对i的更改操作—
引用类型与所引用对象类型不一致的第一种特殊请况: 常量引用可以绑定在非常量i上。
2、指针和const
2.1 指向常量的指针(const int* cptr = &i,其中i可以为常量也可以为非常量,只是限制不能使用指向常量的指针即cptr来改变i的值)
指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址,只能使用指向常量的指针:
const double pi = 3.14;
double *ptr = π//错误:ptr是一个普通指针,不能指向const对象
const double *cptr = π//正确:cptr指向一个double常量
*cptr = 42;//错误:不能使用cptr给const赋值
2.2 const指针(常量指针:必须初始化,int *const c = &i,把星号放在const之前说明指针是一个常量。从右向左读,离c最近的是const,证明c本身是一个常量对象。)
常量指针的值不能改变指的是存放在指针中的那个地址不能改变,但其指向的值可以改变。
3、顶层const
指针本身是一个对象,它又可以指向另外 个对象。 因此, 指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。 用名词顶层const表示指针本身是个常量;用名词底层const表示指针所指的对象是一个常量。
顶层const可以表示任意对象是常量,对于任何数据类型都适用,如算术类型、类、指针等。
底层const则与指针和引用等符合类型的基本类型部分有关。
特殊的是:指针类型既可以是顶层const,也可以是底层const。
int i = 0;
int *const p1 = &i;//指针是常量,顶层const
const int ci = 42;
const int *p2 = &ci;//指针p2所指的基本类型部分为常量,底层const
const int *const p = p2;//右侧为顶层const,左侧为底层const
const int &r = ci;//用于声明引用的const都是底层const
1、当执行拷贝操作时,常量是顶层还是底层const区别明显,其中顶层const不受影响;
底层const的限制不能忽视,当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。(非常量可以转换成常量,反之则不行)