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=&ii;    //指针p2i是常量,所指内容可修改 
    const int * const p3i=&i; //指针p3i是常量,所指内容也是常量 
    p1i=&ii;                  //合法 
    *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];
};

 

posted @ 2013-12-29 21:19  解放1949  阅读(820)  评论(0编辑  收藏  举报