首页 > 编程 > C++ > 正文

C++ primer 学习 之const限定符

2019-11-11 04:23:27
字体:
来源:转载
供稿:网友

学习C++ PRimer也有一段时间了,一直对const这个关键字比较模糊,一忘记就想翻书,这次正好借着这个机会,对这个关键字做一个总结,之间还穿插了指针的知识,方便后面的回顾。

(1)const的初始化 有时我们希望定义一种变量,它的值不能被改变。例如,用一个变量来表示缓冲区的大小。使用变量的好处是我们觉得缓冲区大小不再合适时,很容易对其进行调整,另一方面,也应随时警惕防止程序一不小心改变了这个值。

const int buffersize=512;//输入缓冲区的大小buffersize=500;//错误:试图向const对象写值

以为const对象一旦创建后其值就不能再被改变,所以const对象必须被初始化。

const int i=get_size(); //运行时初始化const int j=42; //编译时初始化const int k; //error:k是一个未经初始化的变量

(2)const的引用 const的引用是理解的难点,我们可以把引用绑定到const的对象上,就像绑定到其他对象上一样,可以称之为对常量的引用(reference to const)。C++primer里面说其实并不存在常量引用:因为引用不是一个对象,所以我们没有办法让引用本身恒定不变。我觉得这句话真正的理解是,这个引用变量本身是不能恒定不变的,因为它可以改变其绑定的引用对象(虽然C++并不允许随意改变引用绑定的对象),但是对常量的引用这个说法确实成立的。在const的引用中,我们还应该注意几点: a:与普通引用不同,对常量的引用不能被用作改变它所绑定的对象;

const int ci=1024; //对const的初始化,正确,引用对象const int &ri=ci; //引用及其对应的引用对象都是常量,正确r1=42; //错误,r1是常量的引用,所以r1的值不能被改变

b:不可以试图让一个非常量引用指向一个常量引用

int &r2=ci; //error

c:对const的引用可能引用一个非const的对象,但是不可以通过常量引用去改变非常量对象的值

int i=42;int &r1=i;const int &r2=i; //错误,r2可以绑定对象i,但是不允许通过r2修改i的值

(3)指针和const 和引用一样,也可以令指针指向那个常量或者非常量,指向常量的指针(pointer to const)不能用于改变其所指对象的值,其定义非常类似上文中对”常量的引用”。

const double pi=3.14;double *ptr=π //错误,ptr是一个普通指针,所以其不能指向常量对象const double *cptr=π//正确,其可以指向一个双精度常量*cptr=42;// 但是不能通过cptr赋值

和常量引用一样,指向常量的指针也没有规定其所指向的对象必须是一个常量,可以换一个角度想一想,所谓指向常量的指针或者引用,其实不过是他们自以为是的的结果罢了,它们自觉地不去改变所指对象的值。 (4)const指针 指针是对象而引用不是,因此就像其他对象类型一样,允许把指针本身定义为常量。常量指针(const pointer)必须初始化,而且一旦完成初始化,则它的值(也就是存放在指针中的那个地址)就不能再改变了。把*放在const之前用以说明指针是一个常量,这样书写说明不变的是指针本身这个值而不是指向的那个值。

int errNumb=0;int *const curErr=&errNumb;

这里还有一个更复杂的写法,用来定义一个指向常量对象的常量指针,*号前的const double 用来说明这个指针所指向的对象的类型:

const double pi=3.14159;const double *const pip=π
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选