const限定符
Posted ygeloutingyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const限定符相关的知识,希望对你有一定的参考价值。
const能对变量加以限定,使其值不可修改。如:
const int inf = 0x3f3f3f3f;
任何试图修改变量inf的值的操作都将引起编译错误。
因为 const 对象一旦创建后就不能修改,所以const对象必须初始化。
const的引用:
可以把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为对常量的引用。与普通引用不同的是,对常量的引用不能用作修改其对象的值。
如:
const int x = 0;
const int &p = x;
任何尝试修改p的值的操作都将引发编译错误。虽然不能直接修改const int &变量的值,不过在某些情况下可以间接修改const int &变量的值。
如:
对const的引用可以引用一个非const的对象,可以通过改变非const对象的值来改变const的引用的值。
1 int x = 0; 2 3 const int &p = x; 4 5 x += 1; 6 7 cout << p << " " << x << endl;//输出1 1
因为x不是const变量,其值可以被修改,而p是x的引用,修改x的值即修改了p的值。
const的引用可以可以初始化为一个字面常量,如:
const int &p = 0;
指针和const:
与引用一样,也可以令指针指向常量或非常量。类似于常量引用,指向常量的指针不能用于改变其所指对象的。想要存放常量对象的地址只能用对应的常量指针。而常量指针可以指向对应的非常量对象,这点是和常量引用一样的。
1 const int cnt1 = 0; 2 3 int cnt2 = 1; 4 5 const int p1 = &cnt1; 6 7 const int p2 = &cnt2;
指向const对象的指针:
const int cnt = 1;
const int *p = &cnt;
上述语句声明的是一个指向常量int变量的指针。所谓指向常量的指针仅仅要求不能通过改变指针来改变对象的值,而没有规定该对象的值不能通过其它途径改变。因为指针p本身并不是一个常量,因此可以令p指向另外一个对象。
即:
1 const int cnt = 1; 2 3 const int *p = &cnt; 4 5 *p += 1; 6 7 //是非法的 8 9 const int cnt = 1; 10 11 const int x = 0; 12 13 const int *p = &cnt; 14 15 p = &x; 16 17 //是合法的
const 指针:
int cnt = 0;
int *const p = &cnt;
通过从右往左解读p的声明语句可以知道,首先p是一个const变量,然后是一个指向int性的指针。因此与上面的p不能改变对象的值但可以指向另外一个对象相反,这里的p可以改变其所指的对象的值,但p本身的值不能改变,即不能指向其他的对象。
即:
1 int cnt = 0; 2 3 int x = 1; 4 5 int *const p = &cnt; 6 7 p = &x; 8 9 //是不合法的 10 11 int cnt = 0; 12 13 int *const p = &cnt; 14 15 *p += 1; 16 17 //是合法的
指向常量的常量指针:
const int cnt = 1;
const int *const p = &cnt;
上述语句声明的是一个指向常量的常量指针。即不能通过改变p来改变p所指的对象的值,也不能改变p的值(p不能指向其它对象)。
顶层 const 和底层 const :
顶层const表示指针本身是一个常量,底层const表示指针所指的对象是一个常量。顶层const和底层const是相互独立的。
更一般的,顶层const可以表示任意对象本身是一个常量,这一点对任何数据类型都适用,如算术类型,类,指针等。底层const则与指针和引用等符合类型的基本类型部分有关。比较特殊的是指针类型既可以是顶层const也可以是底层const,这一点和其他类型区别明显。
以上是关于const限定符的主要内容,如果未能解决你的问题,请参考以下文章