深刻懂得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,在類外可以拜訪。
感興致的讀者可以調試運轉一下本文實例,加深印象的同時還會有新的收成。