关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C++ 类(const修饰普通成员函数)

发布时间:2020-03-21 00:00:00

   const修饰普通成员函数我们知道this指针指向的是具体的对象,普通的成员函数存在(加深记忆),设计this指针的时候格式为*const this(常量指针)。

const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当const修饰类的成员函数时,成员函数有什么特点。

类的成员函数后面加 const ,表面这个函数不会对这个类对象的数据成员(准确的说是非静态数据成员)作任何改变。

 

在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加const,而对于改变数据成员的成员函数不能加const。所以const关键字对成员函数的行为作了更加明确的限定:

 

1.有const修饰的成员(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;

2.在类的成员函数后面加 const 还有什么好处,那就是常量(即const)对象可以调用const成员函数,而不能调用非const 成员函数。

 

1 int myFun(void) const //const修饰的是成员函数2 {}//函数内部不能修改 普通成员变量  mutable修饰时例外
 1 class Data 2 { 3 private: 4     int data; 5      6     mutable int num; 7 public: 8     //遍历 成员的函数 不会去修改成员的值 9     //如果函数不会更改成员数据 就让编译器知道 这是一个const函数10     void myPrintData(void) const 11     {12         //data =10000;//err const修饰函数 函数不能操作普通成员变量13         cout<<this->data<<endl;14         //cout<<data<<endl;
15 16         //mutable修饰的成员变量 可以修改17         num = 200;18     }19     20     Data()21     {22         cout<<"无参构造"<<endl;23     }24     Data(int data)25     {26         this->data =data;27         cout<<"有参构造"<<endl;28     }29     Data(const Data &ob)30     {31         this->data = ob.data;32         cout<<"拷贝构造"<<endl;33     }34     ~Data()35     {36         cout<<"析构函数"<<endl;37     }38 };39 void test02()40 {41     Data ob1(100);42     ob1.myPrintData();43 }

2、const修饰对象 叫常对象

class Data
{private:int data;

    mutable int num;public://遍历 成员的函数 不会去修改成员的值//如果函数不会更改成员数据 就让编译器知道 这是一个const函数void myPrintData(void) const{//data =10000;//err const修饰函数 函数不能操作普通成员变量cout<<this->data<<endl;//cout<<data<<endl;//mutable修饰的成员变量 可以修改num = 200;
    }//编译器认为 普通成员函数 存在修改成员变量 可能void setData(int data) const{//this->data = data;return;
    }
    Data()
    {
        cout<<"无参构造"<<endl;
    }
    Data(int data)
    {this->data =data;
        cout<<"有参构造"<<endl;
    }
    Data(const Data &ob)
    {this->data = ob.data;
        cout<<"拷贝构造"<<endl;
    }~Data()
    {
        cout<<"析构函数"<<endl;
    }
};void test03()
{//常对象const Data ob1(200);//常对象 只能调用const修饰的函数 遍历成员数据ob1.setData(20000);

    ob1.myPrintData();
}

总结:

1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;

2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员

3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。

4)如果只有const成员函数,非const对象是可以调用const成员函数的。当const版本和非const版本的成员函数同时出现时,非const对象调用非const成员函数。

const int num = 10;//系统不会给num开辟空间 num被放入符号表中 如果后期对&num 这时系统才会给num开辟空间

/template/Home/Zkeys/PC/Static