深刻懂得C++中public、protected及private用法。本站提示廣大學習愛好者:(深刻懂得C++中public、protected及private用法)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻懂得C++中public、protected及private用法正文
初學C++的同伙常常在類中看到public,protected,private和它們在繼續中表現的一些拜訪規模,很輕易弄懵懂。明天本文就來非常剖析一下C++中public、protected及private用法。信任關於年夜家深刻控制C++法式設計會有很年夜的贊助。
這裡我們起首要明確上面幾點。
1.類的一個特點就是封裝,public和private感化就是完成這一目標。所以:
用戶代碼(類外)可以拜訪public成員而不克不及拜訪private成員;private成員只能由類成員(類內)和友元拜訪。
2.類的另外一個特點就是繼續,protected的感化就是完成這一目標。所以:
protected成員可以被派生類對象拜訪,不克不及被用戶代碼(類外)拜訪。
現來看看以下示例:
#include<iostream> #include<assert.h> using namespace std; class A{ public: int a; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } void fun(){ cout << a << endl; //准確 cout << a1 << endl; //准確 cout << a2 << endl; //准確,類內拜訪 cout << a3 << endl; //准確,類內拜訪 } public: int a1; protected: int a2; private: int a3; }; int main(){ A itema; itema.a = 10; //准確 itema.a1 = 20; //准確 itema.a2 = 30; //毛病,類外不克不及拜訪protected成員 itema.a3 = 40; //毛病,類外不克不及拜訪private成員 system("pause"); return 0; }
繼續中的特色:
先記住:不論能否繼續,下面的規矩永久實用!
有public, protected, private三種繼續方法,它們響應地轉變了基類成員的拜訪屬性。
1.public繼續:基類public成員,protected成員,private成員的拜訪屬性在派生類平分別釀成:public, protected, private
2.protected繼續:基類public成員,protected成員,private成員的拜訪屬性在派生類平分別釀成:protected, protected, private
3.private繼續:基類public成員,protected成員,private成員的拜訪屬性在派生類平分別釀成:private, private, private
但不管哪一種繼續方法,下面兩點都沒有轉變:
1.private成員只能被本類成員(類內)和友元拜訪,不克不及被派生類拜訪;
2.protected成員可以被派生類拜訪。
再來看看以下代碼:
1.public繼續
代碼以下:
#include<iostream> #include<assert.h> using namespace std; class A{ public: int a; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } void fun(){ cout << a << endl; //准確 cout << a1 << endl; //准確 cout << a2 << endl; //准確 cout << a3 << endl; //准確 } public: int a1; protected: int a2; private: int a3; }; class B : public A{ public: int a; B(int i){ A(); a = i; } void fun(){ cout << a << endl; //准確,public成員 cout << a1 << endl; //准確,基類的public成員,在派生類中還是public成員。 cout << a2 << endl; //准確,基類的protected成員,在派生類中還是protected可以被派生類拜訪。 cout << a3 << endl; //毛病,基類的private成員不克不及被派生類拜訪。 } }; int main(){ B b(10); cout << b.a << endl; cout << b.a1 << endl; //准確 cout << b.a2 << endl; //毛病,類外不克不及拜訪protected成員 cout << b.a3 << endl; //毛病,類外不克不及拜訪private成員 system("pause"); return 0; }
2.protected繼續:
代碼以下:
#include<iostream> #include<assert.h> using namespace std; class A{ public: int a; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } void fun(){ cout << a << endl; //准確 cout << a1 << endl; //准確 cout << a2 << endl; //准確 cout << a3 << endl; //准確 } public: int a1; protected: int a2; private: int a3; }; class B : protected A{ public: int a; B(int i){ A(); a = i; } void fun(){ cout << a << endl; //准確,public成員。 cout << a1 << endl; //准確,基類的public成員,在派生類中釀成了protected,可以被派生類拜訪。 cout << a2 << endl; //准確,基類的protected成員,在派生類中照樣protected,可以被派生類拜訪。 cout << a3 << endl; //毛病,基類的private成員不克不及被派生類拜訪。 } }; int main(){ B b(10); cout << b.a << endl; //准確。public成員 cout << b.a1 << endl; //毛病,protected成員不克不及在類外拜訪。 cout << b.a2 << endl; //毛病,protected成員不克不及在類外拜訪。 cout << b.a3 << endl; //毛病,private成員不克不及在類外拜訪。 system("pause"); return 0; }
3.private繼續:
代碼以下:
#include<iostream> #include<assert.h> using namespace std; class A{ public: int a; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } void fun(){ cout << a << endl; //准確 cout << a1 << endl; //准確 cout << a2 << endl; //准確 cout << a3 << endl; //准確 } public: int a1; protected: int a2; private: int a3; }; class B : private A{ public: int a; B(int i){ A(); a = i; } void fun(){ cout << a << endl; //准確,public成員。 cout << a1 << endl; //准確,基類public成員,在派生類中釀成了private,可以被派生類拜訪。 cout << a2 << endl; //准確,基類的protected成員,在派生類中釀成了private,可以被派生類拜訪。 cout << a3 << endl; //毛病,基類的private成員不克不及被派生類拜訪。 } }; int main(){ B b(10); cout << b.a << endl; //准確。public成員 cout << b.a1 << endl; //毛病,private成員不克不及在類外拜訪。 cout << b.a2 << endl; //毛病, private成員不克不及在類外拜訪。 cout << b.a3 << endl; //毛病,private成員不克不及在類外拜訪。 system("pause"); return 0; }
經由過程以上的代碼都備有較為詳實的正文,讀者應當可以或許懂得。細心看代碼中派生類B中界說了和基類同名的成員a,此時基類的a依然存在,可以驗證。
int main(){ cout << sizeof(A) << endl; cout << sizeof(B) << endl; system("pause"); return 0; }
輸入:
16
20
所以派生類包括了基類一切成員和新增的成員,同名的成員被隱蔽起來,挪用的時刻只會挪用派生類中的成員。
假如要挪用基類的同名成員,可以用以下辦法:
int main(){ B b(10); cout << b.a << endl; cout << b.A::a << endl; system("pause"); return 0; }
輸入:
10
4
記得這裡是在類外拜訪,而a在基類中是public,所以繼續方法應當為public,使得a在派生類中依然為public,在類外可以拜訪。
感興致的讀者可以調試運轉一下本文實例,加深印象的同時還會有新的收成。