C++Primer学习笔记—(const限定符)

来源:互联网 发布:手机道路测量软件 编辑:程序博客网 时间:2024/04/28 18:05

(1)在const创建的对象中需要注意的问题是const对象一旦被创建就无法更改,同时const对象定义是要初始化。
注意定义格式:例:const int limit=10,
错误:const int low,top=30,在这里low并没有初始化;
当然,在编译器会有错误提示。
 (2)const对象默认为文件的局部变量(非const对象默认为extern)

Exercises Section 2.4:
Exercise 2.22.下种段虽然合法,但是风格很糟糕。有什么问题呢?怎样
改善?
for (int i = 0; i < 100; ++i)
答:100在这里是魔数(magic number),带来两个问题:(1)程序的可读性:无法知道100表示什么,更无法知道为什么i要和100比较;(2)程序的可维护性:假设程序很大,那么100就可能会出现很多次。当然在这些100当中,它们表示的意思或许不同,如果要修改其中某些“100”的时候就会很难确定这些“100”的意思来做出修改。
解决问题的方法是使用变量来初始化常量;
int array_size=100;
for(int i = 0; i < array_size; ++i)

Exercise 2.23:
下列哪些语句合法?对于那些不合法的,请解释为什么不
合法。
(a) const int buf;
(b) int cnt = 0;
const int sz = cnt;
(c) cnt++; sz++;

答:(a)错:const对象无初始化;(c)错,修改了const对象。

提出疑问:
在exercise2.23中的(b)中,先把cnt变量初始化为0,然后在把它作为右值放在const 对象sz的初始化式中,在VC++6.0中,
编写如下代码:
const int limit=10;
int cnt=10;
const int index=limit;
cout<<limit<<endl
<<cnt<<endl
<<index<<endl;
可以看到结果:
如果就这么看的话结果是正确的,但是在调试中,const的值并不是10.得到这样的值是不正确的。

 猜想:1.VC++6.0版本太低,无法支持这种const对象的初始化。
2.const对象的这种初始化式本身不正确,或者说属于未定义行为。

为了验证猜想1.在VS2010中输入代码:

可以看到index调试的值仍然和vc6.0调试结果一样。
那么问题是不是猜想2那样呢?
在验证猜想2之前,先说一下一个有趣的现象,如果把const对象放到mian函数之外的话,在vc++6.0中,运行结果也正确,但是在调试中却出现:

 而在vs2010中:

在这里的调试中得到了我们想要的结果。可以看到VS确实有优化。
具体原因是什么





二、const引用:用以指向const对象的引用
1,不能将飞const引用绑定到const对象中:
如:const int val=10;
int &valiable=val;错误。

C++primer提到了一个比较有趣的过程:如果编写
double dval=3.14;
const double &ri=dval;
编译器会把代码转换为:
double dval=3.14;
double temp=dval;
const double &ri=temp;
这样的转换有什么事出乎意料的呢,可能就这样还不是很明显。但如果ri并不是一个const引用,那么我们尝试利用ri改变dval的值,可以发现这样是不能够的。

0 0
原创粉丝点击