zoukankan      html  css  js  c++  java
  • 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
    "
        const char string[] = "abcdefg
    ";
        ……
        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];
    };
    
  • 相关阅读:
    淘宝网-六属性
    软件架构之黑板模式
    06需求工程-软件建模与分析阅读笔记之六
    05需求工程-软件建模与分析阅读笔记之五
    04需求工程-软件建模与分析阅读笔记之四
    03需求工程-软件建模与分析阅读笔记之三
    第二次冲刺团队绩效评估
    第二次冲刺站立会议07
    第二次冲刺站立会议06
    第二次冲刺站立会议05
  • 原文地址:https://www.cnblogs.com/MrGreen/p/3496801.html
Copyright © 2011-2022 走看看