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对象是安全的。
通常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对象是安全的。
相关文章推荐
- C++编程思想(2nd卷一):常量
- C++编程思想(2nd卷一):多态性和虚函数
- C++编程思想(2nd卷一):内联函数
- C++编程思想(2nd卷一):函数重载与默认参数
- C++编程思想(2nd卷一):模板简介
- C++编程思想(2nd卷一):名字控制
- C++编程思想(2nd卷一):引用和拷贝构造函数
- C++编程思想(2nd卷一):运算符重载
- C++编程思想(2nd卷一):内联函数
- C++编程思想(2nd卷一):引用和拷贝构造函数
- C++编程思想(2nd卷一):动态对象创建
- C++编程思想(2nd卷一):名字控制
- C++编程思想(2nd卷一):运算符重载
- C++编程思想(2nd卷一):继承和组合
- C++编程思想(2nd卷一):动态对象创建
- C++编程思想(2nd卷一):多态性和虚函数
- C++编程思想(2nd卷一):继承和组合
- C++编程思想(2nd卷一):函数重载与默认参数
- C++编程思想(2nd卷一):模板简介
- C++编程思想笔记(0110)。。。