本人阅读《C++编程思想》时做的一些笔记,欢迎大家批评指正,e‐mail:zuoan911@gmail.com。
const int bufsize; 通常 C++编译器并不为 const 创建存储空间,它把这个定义保存在他的符号表里,但上面
的 extern 强制进行了存储空间的分配(P176),另外还有其他一些情况,如取一个 const 的地址,或是一个编
译期间不知道初始值的 const,或为 const 集合,也要进行存储空间分配。例如:
const int i = 100;
const int j = i + 10;
long addr = (long)&j; //需获取 const 地址,需分配存储空间
char buf[j+10];
const char c = cin.get(); //编译期间初始值不知道,需分配存储空间
const char c2 = c + ‘a’;
15、若为 const 集合,则编译期间不能使用它的值,如:
const int i[] = {1, 2, 3, 4};
float f[i[2]]; //错误,为 const 集合,其分配的存储空间内的内容,编译期间并不需要知道,P177
16、C 和 C++中 const 的区别(P178):
a、C 中 const 默认为外部链接,C++中默认为内部连接;
b、C 中一个 const 总是需要创建一块内存空间,C++中根据使用情况而定,若仅用于用一个名字替代一
个值(如#define 用法),则不 分配存储空间。
17、指针常量: Type * const pointer ; //必须把 const 表明放在*右边才是一个 const 指针
常量指针: const Type *pointer ; 或 Type const* pointer
不存在 const* char 它无法通过编译
从右向左读(* 读成 pointer to)
char * const p; //读作 p is a const pointer to char
const char * p; //读作 p is a pointer to const char
char const * p; //与 const char * p;读法一样)
18、char* str = "hello"; hello 被编译器作为一个常量字符数组建立,str 是指向常量字符数组首地址的指针,
但是,修改该字符数组的任何字符都会导致运行时错误(并不是所有的编译器都会做到这一点),好的风格是
这么定义:char str[] = "hello";
19、有一种观点:C 中的一切都是按值来传递的,传递指针时,也会得到一份副本,即也是通过值传递指
针的。
20、临时量:临时量自动生成为常量,改变临时量是错误的,因为编译器使所有临时量自动生成为 const 的。
临时量常产生于函数返回值等。
21、一个内部类型的 static const 可以看作一个编译期间的常量,同时,必须在 static const 定义的地方初始
化,而类中所有其他数据成员必须在构造函数或其他成员函数里初始化。如:
class Example
{
private:
static const int size = 100; //必须在定义时初始化
const string * stack[size];
.............
}
22、const 对象不能调用非 const 成员函数;const 成员函数调用 const、非 const 对象和非 const 数据成员都
是安全的;非 const 对象调用 const 和非 const 成员函数是正确的。
23、const 实现有按位 const 和按逻辑 const:
a按位 const 意思是对象中的每个字节都是固定的,对象的每个位映象都从不改变;
b按逻辑 const 意思是整个对象从概念上讲是不变的,但是可以以成员为单位改变。