您的位置:首页 > 编程语言 > C语言/C++

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

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

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

如果使用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成员函数的语法:

首先注意前面的带const的函数声明,它表示函数的返回值是const,必须把修饰符const放在函数参数表的后面。

int X::f() const {return i;}

一个const成员函数调用const和非const对象是安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: