现在的位置: 首页 > 综合 > 正文

C++ 中 const 应用总结

2014年01月13日 ⁄ 综合 ⁄ 共 1645字 ⁄ 字号 评论关闭
//test const 使用细则

class Game
{
public:
    int a;
};

void function(const Game& obj)
{
    //obj.a = 1;     //×,内容不可变
}

void function(const string& s)
{
    string tmp = "test";
    //s = tmp;      //×,内容不可变
}

int _tmain(int argc, _TCHAR* argv[])
{

    //1. 定义常量(两种本质相同,都是定义常量)
    const int a = 100;
    int const b = 100;

    //a = 1;   //错误
    //b = 1;   //错误

    //2. 指针(*在const左侧则则表示指针不可变, 右侧表示内容不可改)
    char cDataA[100];
    char cDataB[100];
    char cDataC[100];
    char cDataD[100];
    char* const pDataA = cDataA;        //定义指针常量
    //pDataA = cDataB;                  //×,指针为常量不可以变
    pDataA[0] = 'A';                    //√,内容可变

    const char* pDataB = cDataA;        //指针指向内容不可以改变
    pDataB = cDataB;                    //√,指针可变
    //pDataB[0] = 'B';                  //×,内容不可变

    char const *pDataC = cDataC;
    pDataC = cDataB;                    //√,指针可变
    //pDataC[0] = 'A';                  //×,内容不可变

    const char* const pDataD = cDataD;
    //pDataD = cDataB;                  //×,指针为常量不可以变
    //pDataD[0] = 'A';                  //×,内容不可变


    //3. 函数中使用常量
    //void function(const int a);       //a为形参,调用时会自动拷贝,无意义(注意:仅限于基本类型[int,bool,float])
    //void function(const char* p);     //p所指内容不可改变,这个经常要用到
    //void function(char* const p);     //p为形参,调用时会自动拷贝,无意义
    //void function(const Class& a);    //此做法是为了提高效率,实际a为地址,不对原对象进行拷贝传递,a中内容不可变
    //void function(const Type& a);     //此做法是为了提高效率,实际a为地址,不对原对象进行拷贝传递,a中内容不可变

    
    //4. 类中使用常量
    class ClassA
    {
    public:    
        const int a;
        char* const p;
        int b;

    public:
        ClassA(int x, char* ptr):
          a(x),p(ptr)                   //√,初始化序列中可以更改常量值
        {
            //a = x;                    //×,a的初始化只能在初始化序列中
        }

        int GetAValue() const           //函数后边加const表示此函数不改变类成员变量
        {
            if(a>0)
                return a;               //√,返回成员变量是允许的
            return b;                   //√,返回常量也是可以的
        }
        
        void SetAValue(int v) const
        {
            //a = v;                    //×,不能改变常量参数
            //b = v;                    //×,函数声明为const不能改变类中成员变量的值
        }
    
        void SetBValue(int v)
        {
            b = v;
        }
    };

    const ClassA CA(10,NULL);
    CA.GetAValue();                     //√,常量对象可以调用常量对象方法
    //CA.SetBValue(1);                  //×,常量对象不能调用非常量(const)函数

    const ClassA* pCA = new ClassA(10, NULL); 
    pCA->GetAValue();                   //√,常量对象可以调用常量对象方法
    //pCA->SetBValue(1);                //×,常量对象不能调用非常量(const)函数

    ClassA NA(10, NULL);
    NA.GetAValue();                     //√,非常量对象可以调用常量对象方法
    NA.SetBValue(1);                    //√,非常量对象可以调用普通对象方法

    getchar();
    return 0;
}

 

抱歉!评论已关闭.