C++ 私人成員變數的理解

來源:互聯網
上載者:User

私人成員變數的概念,在腦海中的現象是,以private關鍵字聲明,是類的實現部分,不對外公開,不能在對象外部存取對象的私人成員變數.

然而,在實現拷貝建構函式和賦值符函數時,在函數裡利用對象直接存取了私人成員變數,因而,產生了困惑.下面以具體執行個體進行說明:

 1 class CTest { 2 public: 3     CTest(int i);  4     CTest(const CTest& rhs); 5     CTest& operator=(const CTest& rhs); 6     void printCTest(const CTest& rhs); 7 private: 8     int value; 9 };10 11 CTest::CTest(int i):value(i)12 {13     cout<<"Contructor of CTest"<<endl;14 }15 16 CTest::CTest(const CTest& rhs):value(rhs.value)17 {18     cout<<"Copy contructor of CTest"<<endl;19 }20 21 CTest& CTest::operator=(const CTest& rhs)22 {23     cout<<"Assign function of CTest"<<endl;24 }25 26 CTest& CTest::operator=(const CTest& rhs)27 {28     cout<<"Assign function of CTest"<<endl;29     if(this == &rhs)30         return *this;31     value = rhs.value;                //通過對象訪問私人成員變數32     return *this;33 }34 35 void CTest::printCTest(const CTest& rhs)36 {37     cout<<rhs.value<<endl;        //通過對象訪問私人成員變數38 }39 int main()40 {41     CTest t = 1;42     CTest tt = 2;43 //  cout<<t.value<<endl;        //通過對象訪問私人成員變數,編譯錯誤44 //  cout<<tt.value<<endl;        //通過對象訪問私人成員變數,編譯錯誤45     t.printCTest(tt);46 }    

疑惑:為什麼第31行和第37行代碼可以編譯通過,而第43行和第44行代碼會產生編譯錯誤?

產生這種疑惑的原因是自己對私人成員變數的理解有誤,封裝是編譯期的概念,是針對類型而非對象的,在類的成員函數中可以訪問同類型執行個體對象的私人成員變數

具體的解析如下:從變數value的符號是怎麼解析的分析

1.確定符號的尋找域

如第37行代碼,當編譯器發現value變數時,它會在value變數所屬的對象rhs的類域中尋找該符號.

2.確定當前域中哪些符號可以訪問

由第1步可知,當前尋找的域是類域,而printCTest函數在CTest類體中,所以printCTest可以訪問CTest類中的所有變數(包括私人成員變數),因而value符號在CTest類域中被找到.

如第43行代碼,main函數不在CTest類體中,所以main函數不可以訪問CTest類域中的私人成員變數.

3.符號已尋找到,編譯通過

類成員變數的存取權限是編譯器強加的,編譯器可以找到value,通過編譯,自然就可以訪問到value變數的值.

直覺上,我們會以為第37行代碼中value符號的尋找域應該是對象rhs對應的範圍,然而C++編譯器的實現卻是在對象rhs的類域尋找value符號.

啟發:有些直覺是靠不住的,需要深入分析其背後的實現原理,才可以理解透徹.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.