C++ this与常成员函数

 在普通类成员函数的参数表后面(花括号前面)加上const,这个成员函数就是常成员函数

格式:返回类型 函数名(参数表) const {函数体}

常成员函数中的this指针是一个常量指针,一般不能在常成员函数中修改成员变量值

#include <iostream>
#include<string>
using namespace std;

class A {
public:
    A(int data):m_data(data){}

    void print (void)const {  //常成员函数,const修饰的是函数内的this指针
        //在这个函数内this指针是常量指针,所以一般不能在这个函数内修改成员变量值
        cout << m_data << endl;

        m_xx = 99;  //由于mutable,所以可以修改
        cout << m_xx << endl;

        //int* p=const_cast<int*>(&m_spec);//非要修改变量值,先去常转换【方式一】
        //*p = 200;
        const_cast<A*>(this)->m_spec = 200; //给this指针去常
        cout << m_spec << endl;
    }

private:
    int m_data;
    int m_spec;
    mutable int m_xx;//mutable不受const属性的影响,任何时候都可以修改
    //mutable的中文意思是“可变的,易变的”

};

int main()
{
    A a(100);
    a.print();
    return 0;
}

 

注意:权限

#include <iostream>
#include<string>
using namespace std;

class A {
public:
    void func1(void)const{  //常函数
        cout << "常函数" << endl;
    }
    void func2(void) {  
        cout << "非常函数" << endl;
    }       
};

int main()
{
    A a;  //非常对象
    const A b; //常对象
    a.func1(); //a的地址给const this时,是缩小权限,所以合法
    a.func2();
    //非常对象:非常函数和常函数都可以调用

    b.func1();
    //b.func2();  错,因为b具有const,而func2中的this没有const,所以b的地址给this时,是扩大权限,非常危险,不合法
    //常对象:只能调用常函数,不能调用非常函数
    //错误原因:常对象的常指针this,传给非常函数的非常指针this,扩大的指针的权限,所以不行

    const A* p;
    //p->func2()  错

    const A& aa;
    //aa.func2()  错

}

 

常函数和非常函数可以构成函数的重载

 

 

 

 

 

 

 

 

 

posted @ 2019-03-23 09:22  天子骄龙  阅读(347)  评论(0编辑  收藏  举报