7.类的访问控制和继承
在C++中,我們使用訪問(wèn)說(shuō)明符加強(qiáng)類(lèi)的封裝性。
訪問(wèn)說(shuō)明符有:public、private、protected
1)定義在public說(shuō)明符之后的成員在整個(gè)程序內(nèi)可以被訪問(wèn),public成員定義類(lèi)的接口。
2)定義在private說(shuō)明符之后的成員可以只能由類(lèi)的接口訪問(wèn),private部分封裝了(隱藏了)類(lèi)的實(shí)現(xiàn)細(xì)節(jié)。
3)由于我們定義的類(lèi)希望某些成員可以在類(lèi)的繼承過(guò)程中和派生類(lèi)分享,而不被其他公共部分訪問(wèn),因此便設(shè)定protected說(shuō)明符。定義在protected訪問(wèn)符之后的成員,常用于派生類(lèi)和友元。
什么是友元?
友元分友元函數(shù)和友元類(lèi)。類(lèi)與類(lèi)或函數(shù)之間要進(jìn)行某些相關(guān)操作,就要用到友元!有時(shí)需要定義一些函數(shù),這些函數(shù)不是類(lèi)的一部分,但又需要頻繁地訪問(wèn)類(lèi)的數(shù)據(jù)成員,這時(shí)可以將這些函數(shù)定義為該類(lèi)的友元函數(shù)。除了友元函數(shù)外,還有友元類(lèi),兩者統(tǒng)稱(chēng)為友元。?如果一個(gè)類(lèi)指定了友元類(lèi),則友元類(lèi)的成員函數(shù)可以訪問(wèn)包括此類(lèi)非公有成員在內(nèi)的所有成員!友元能夠使得普通函數(shù)直接訪問(wèn)類(lèi)的保護(hù)數(shù)據(jù),避免了類(lèi)成員函數(shù)的頻繁調(diào)用,可以節(jié)約處理器開(kāi)銷(xiāo),提高程序的效率,但所矛盾的是,即使是最大限度的保護(hù),同樣也破壞了類(lèi)的封裝特性,這即是友元的缺點(diǎn)。
使用友元類(lèi)時(shí)注意:
(1) 友元關(guān)系不能被繼承。?
(2) 友元關(guān)系是單向的,不具有交換性。若類(lèi)B是類(lèi)A的友元,類(lèi)A不一定是類(lèi)B的友元,要看在類(lèi)中是否有相應(yīng)的聲明。
(3) 友元關(guān)系不具有傳遞性。若類(lèi)B是類(lèi)A的友元,類(lèi)C是B的友元,類(lèi)C不一定是類(lèi)A的友元,同樣要看類(lèi)中是否有相應(yīng)的聲明。
?
其實(shí)在C++中,struct和class的差別也在于此!class可以看成是struct的加強(qiáng)版
struct的默認(rèn)訪問(wèn)說(shuō)明符是public,默認(rèn)public繼承;class的默認(rèn)訪問(wèn)說(shuō)明符是private,默認(rèn)private繼承
在繼承機(jī)制中,有派生訪問(wèn)說(shuō)明符。分為:public、private、protected
要深刻理解下面這兩句話:
1)派生訪問(wèn)說(shuō)明符對(duì)于派生類(lèi)的成員(及友元)能否訪問(wèn)其直接基類(lèi)成員沒(méi)有什么影響。對(duì)基類(lèi)成員的訪問(wèn)權(quán)限只和基類(lèi)的訪問(wèn)說(shuō)明符有關(guān)。
2)派生訪問(wèn)說(shuō)明符的目的是控制派生類(lèi)對(duì)象(包括派生的派生)對(duì)于基類(lèi)成員的訪問(wèn)權(quán)限。(查看本博客C++模塊第8篇文章)
?
簡(jiǎn)單測(cè)試一下:
using namespace std; class A {int a = 3; public:int fun() { int b = a; cout << a << endl; return a; } };class B:public A {using A::fun; public:void fun(int c) { int b = fun()+c; cout << b << endl; } };int main() {B b;b.fun(6);system("pause");return 0; }總的來(lái)說(shuō),派生類(lèi)的對(duì)象想要訪問(wèn)基類(lèi)的某個(gè)成員,你得首先看看派生類(lèi)對(duì)于基類(lèi)的繼承形式是怎樣的!基類(lèi)在不同的繼承形式下,它的成員在派生類(lèi)中具有不同的訪問(wèn)屬性!(查看本博客C++模塊第8篇文章);而派生類(lèi)的成員或者友元要訪問(wèn)其基類(lèi)的成員函數(shù)時(shí),只與基類(lèi)中的訪問(wèn)說(shuō)明符有關(guān)!
總結(jié)
以上是生活随笔為你收集整理的7.类的访问控制和继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 剑指offer:给定一个数组A[0,1,
- 下一篇: 8.公有继承 保护继承 私有继承