修飾權(quán)限
- public 所有均可訪問刁卜;
- private 類自己的成員函數(shù)或友元訪問,不能被類對象曙咽、子類訪問蛔趴;(封裝概念)
- protected 類自己、友元以及子類訪問例朱,不能被類對象訪問孝情;(繼承概念)
- friend 友元,別人是你的朋友洒嗤,他可以訪問我的東西箫荡。(但不是我可以訪問他的東西)
struct和class
- struct 缺省權(quán)限是 public, class 缺省權(quán)限是 private;
- C++ 中渔隶,只有成員變量很簡單數(shù)量少才可能使用 struct羔挡;一般使用 class洁奈;
繼承/派生
繼承基類,在基類前省略 public 等時(shí)绞灼,默認(rèn)是 protected 屬性利术;
public 繼承:基類 public 成員,protected 成員低矮,private 成員的訪問屬性在派生類中分別變成:public, protected, private印叁;(不變)
protected 繼承:基類 public 成員,protected 成員军掂,private 成員的訪問屬性在派生類中分別變成:protected, protected, private轮蜕;(public變protected)
private 繼承:基類 public 成員,protected 成員良姆,private 成員的訪問屬性在派生類中分別變成:private, private, private肠虽。(public和protected變private)
派生類包含了基類所有成員以及新增的成員,同名的成員被隱藏起來玛追,調(diào)用的時(shí)候只會調(diào)用派生類中的成員。
int main(){
B b(10);
cout << b.a << endl;//基類和子類同名闲延,從子類對象調(diào)用痊剖,默認(rèn)調(diào)用子類的成員
cout << b.A::a << endl;//調(diào)用B的基類A的同名成員
system("pause");
return 0;
}
友元關(guān)系
友元
? 類的友元函數(shù)是定義在類外部,但有權(quán)訪問類的所有私有(private)成員和保護(hù)(protected)成員垒玲。盡管友元函數(shù)的原型有在類的定義中出現(xiàn)過陆馁,但是友元函數(shù)并不是成員函數(shù)。
? 友元可以是一個(gè)函數(shù)合愈,該函數(shù)被稱為友元函數(shù)叮贩;友元也可以是一個(gè)類,該類被稱為友元類佛析,在這種情況下益老,整個(gè)類及其所有成員都是友元。
友元函數(shù)聲明和定義
- 要聲明函數(shù)為一個(gè)類的友元寸莫,需要在類定義中該函數(shù)原型前使用關(guān)鍵字 friend
- 聲明類 ClassTwo 的所有成員函數(shù)作為類 ClassOne 的友元捺萌,需要在類 ClassOne 的定義中放置如下聲明:
friend class ClassTwo;
class INTEGER
{
friend void Print(const INTEGER& obj);//聲明友元函數(shù)
};
// 請注意:print() 不是任何類的成員函數(shù),函數(shù)名前不加類聲明符
void Print(const INTEGER& obj)
{
//函數(shù)體
}
void main()
{
INTEGER obj;
Print(obj);//直接調(diào)用
}
特點(diǎn)
- 友元關(guān)系不能被繼承膘茎;
- 友元關(guān)系是單向的桃纯,不具有交換性。若類 B 是類 A 的友元披坏,類 A 不一定是類 B 的友元态坦,要看在類中是否有相應(yīng)的聲明;
- 友元關(guān)系不具有傳遞性棒拂。若類 B 是類 A 的友元伞梯,類 C 是 B 的友元,類 C 不一定是類 A 的友元,同樣要看類中是否有相應(yīng)的申明壮锻;
- 友元函數(shù)并不是類的成員函數(shù)琐旁,因此在類外定義的時(shí)候不能加上 class::function name;