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

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开辟空间
posted @ 2020-03-20 22:47  进击的小尧好程序员  阅读(1012)  评论(0编辑  收藏  举报