C++编程思想(2nd卷一):常量

      C++中的const默认为内部连接,也就是说,const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到。当定义一个const时,必须赋一个值给它,除非用extern作出了清楚的说明。

 

      通常C++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里。但是extern强制进行了存储空间分配(另外还有一些情况,如取一个const的地址,也要进行存储空间分配),由于extern意味着使用外部连接,因此必须分配存储空间,这也就是说有几个不同的编译单元应当能够引用它,所以它必须存储空间。

 

如果使用const,那么编译时会进行常量折叠。

const可以用于集合,但不能在编译期间使用它的值,因为编译器在编译期间不需要知道存储的内容,如下代码是错误的:

在C++中,出现在所有函数之外的const的作用域是整个文件(也就是它只是在该文件外不可见)。
为了使const成为外部连接以便让另外一个文件可以对它引用,必须明确地把它定义成extern,如下面这样:
extern const int x = 1;


指向const的指针(使指向的元素不发生改变):const int* u;  或  int const* v;(推荐使用第一种方式)不需要初始化
const指针(指针本身不发生改变):int* const w = &d; 需要初始化
一个const指针指向一个const对象:const int* const x = &d;  或  int const* const x2 = &d;
事实上,'*'与标识符结合,而不是与类型结合。

 

字符数组的字面值:
没有强调const的地方是字符数组的字面值。
char* cp = "howdy";
      编译器将接受它而不报告错误。从技术上讲, 这是一个错误,因为字符数组的字面值是被编译器作为一个常量字符数组建立的,所引用该字符数组得到的结果是它在内存里的首地址。修改该字符数组的任何字符都会导致运行时错误。
如果想修改字符串,就要把它放到一个数组中:
char cp[ ] = "howdy";

 

当按值返回一个内部类型时,const没有意义的原因是:编译器已经不让它成为一个左值(因为它总是一个值而不是一个变量)
编译器使所有的临时量自动地成为const。
无论什么时候传递一个地址给一个函数,都应该尽可能用const修饰它,如果不这样,就不能以const指针参数的方式使用这个函数。

让一个类有编译期间的常量成员,需要使用static。即一个内部类型的static const可以看成一个编译期间的常量。
必须在static const定义的地方对它进行初始化。

 

声明const成员函数的语法:
首先注意前面的带const的函数声明,它表示函数的返回值是const,必须把修饰符const放在函数参数表的后面。
int X::f( ) const { return i; }
一个const成员函数调用const和非const对象是安全的。

      如果想要建立一个const成员函数,但仍然想在对象里改变某些数据,应当在类声明里使用关键字mutable,以指定一个特定的数据成员可以在一个const对象里被改变。
例:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值