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開辟空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM