const
面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1.限定符声明变量只能被读 const int i = 5; int j = 0; …… i = j; //非法,导致编译错误 j = i; //合法 2.必须初始化 const int i = 5; //合法 const int j; //非法,导致编译错误 3.在另一个文件中引用const常量 extern const int i; //合法 extern const int j = 10; //非法,常量不可以被再次赋值 5.可以避免不必要的内存分配 #define STRING "abcdefg\n" const char string[] = "abcdefg\n"; …… printf(STRING); //为STRING分配了第一次内存 printf(string); //为string一次分配了内存,以后不再分配 …… printf(STRING); //为STRING分配了第二次内存 printf(string); …… 由于const定义常量从汇编的角度来看,只是给出了对应的内存地址, 而不是像#define一样给出的是立即数,所以,const定义的常量在程 序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个 拷贝。 6.可以通过函数对常量进行初始化 int value(); const int i = value(); 说:假定对ROM编写程序时,由于目标代码的不可改写,本语句将会无 效,不过可以变通一下: const int &i = value(); 只要令i的地址处于ROM之外,即可实现:i通过函数初始化,而其值不 会被修改。 7.是不是const的常量值一定不可以被修改呢? 观察以下一段代码: const int a = 5; // a是int常量,没有问题 int *p = (int*)&a; // p是指向a的指针,没有问题 *p = 6; //将p指向的地址储存的值修改为6,因为p并不是const int* 类型的,所以编译器不认为这块有问题 cout<<a<<endl; // 输出5 cout << *p << endl;// 输出6,这里让人有些不解了,难道p不指向a了? cout << &a << " " << p << endl; // 通过这里发现,a的地址和p指向的地址相同!!! /* 这里,因为a是个const常量,所以编译器认为a的值不会被改变,所以再之后用a的时候, a代表的不是一个地址(常量整形a的地址),而是一个符号——5. 所以,之后输出a的操作并没有去内存中读取,而是直接通过替换的方式输出的。 这些仅供了解,看过就忘了就好,如果哪个公司出这种不着调的题,你可以直接拍屁股走人了! */ 8. 请分清数值常量和指针常量,以下声明颇为玩味: int ii=0; const int i=0; //i是常量,i的值不会被修改 const int *p1i=&i; //指针p1i所指内容是常量,可以不初始化 int * const p2i=ⅈ //指针p2i是常量,所指内容可修改 const int * const p3i=&i; //指针p3i是常量,所指内容也是常量 p1i=ⅈ //合法 *p2i=100; //合法 关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性, 参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文。 以下代码错误 (const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。 因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类 声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成 员的值是什么。如 ) class A { const int size = 100; int array[size]; }; 以下代码正确 class A { static const int size = 100; int array[size]; };
Dreams are one of those things that keep you going and happy!!!