類訪問控制(包括copy機制相關)

2021-06-07 19:35:38 字數 3157 閱讀 1535

問題(知識點)描述:

a. 

在c++

的類的成員函式中,允許直接訪問該類的物件的私有成員變數。

b.

在類的成員函式中可以訪問同型別例項的私有變數。

c. 

拷貝建構函式裡,可以直接訪問另外乙個同類物件(引用)的私有成員。

d.

類的成員函式可以直接訪問作為其引數的同型別物件的私有成員。

舉例描述上述知識:

1).在拷貝建構函式中可以訪問引用物件的私有變數:例如: 

class   point

point(point &p);

private:

int x,y;

};point::point (point &p)

2). 在類的成員函式中可以訪問同型別例項的私有變數

class  a

voidseta(int val)

voidassign(a& _aa)

voiddisplay()

void useprivatemember()

請記住你是在定義你的類,不是在用。

2.   c++的訪問修飾符的作用是以類為單位,而不是以物件為單位。

通俗的講,同類的物件間可以「互相訪問」對方的資料成員,只不過訪問途徑不是直接訪問.

步驟是:通過乙個物件呼叫其public成員函式,此成員函式可以訪問到自己的或者同類其他物件的public/private/protected資料成員和成員函式(類的所有物件共用),而且還需要指明是哪個物件的資料成員(呼叫函式的物件自己的成員不用指明,因為有this指標;其他物件的資料成員可以通過引用或指標間接指明)

可以提供訪問行為的主語為「函式」。

類體內的訪問沒有訪問限制一說,即private函式可以訪問public/protected/private成員函式或資料成員,同理,protected函式,public函式也可以任意訪問該類體中定義的成員public繼承下,基類中的public和protected成員繼承為該子類的public和protected成員(成員函式或資料成員),然後訪問仍然按類內的無限制訪問。

3.   注意公有和私有的概念:每個類的物件都有自己的存貯空間,用於儲存內部變數和類成員;但同乙個類的所有物件共享一組類方法,即每種方法只有乙個源本。很明顯,類方法是所有該類物件共同使用的,因此不存在每個物件有一組類方法的副本。源本的類方法自然可以訪問所有該類物件的私有成員。

4.   訪問許可權是相對於類而言,而非物件!

乙個問題,為什麼成員函式可以訪問私有成員呢?結果很顯然,如果不能訪問,那麼私有成員的存在就沒有了意義。而對於成員函式中允許訪問物件的資料成員,一方面保證了安全性與封裝性,另一方面提供方便的操作。第一句話的解釋,就是承認只有成員函式可以訪問私有成員,這裡不涉及友元及派生。這樣一來,安全性仍然得到了保證,也完成了封裝工作。對於第二句話,試想,如果都得靠介面來實現資料傳送,那麼操作是否極為不便?既然處於成員函式中,已經保證了足夠的安全和封裝性,那麼這裡如果還得借助介面,就有些不合情合理了。作為對資料成員的靈活處理,設計者允許在成員函式中訪問物件的私有成員,為使用者提供了很大的方便。這同時也反映了語言的靈活性和原則性.

c++中類訪問許可權控制:

第一:private, public, protected 訪問標號的訪問範圍,在沒有繼承的情況下:

private:

只能由1.

該類中的函式、

2.其友元函式訪問。

不能被任何其他訪問,該類的物件也不能訪問。

protected:

可以被1.

該類中的函式、

2.子類的函式、以及

3.其友元函式訪問。

但不能被該類的物件訪問。

public:

可以被1.

該類中的函式、

2.子類的函式、

3.其友元函式訪問,也可以由

4.該類的物件訪問。 注:

友元函式包括

3種:設為友元的普通的非成員函式;設為友元的其他類的成員函式;設為友元類中的所有成員函式。

第二:類的繼承後方法屬性變化,具體情況如下:

private 屬性是不能夠被繼承的,protected繼承和private繼承能降低訪問許可權。

使用private

繼承,父類的

protected

和public

屬性在子類中變為

private;使用

protected

繼承,父類的

protected

和public

屬性在子類中變為

protected;使用

public

繼承,父類中的

protected

和public

屬性不發生改變; 

如下所示:

public:          protected:       private:

public

繼承public           protected       

不可用protected

繼承protected     protected       

不可用private

繼承private          private             

不可用

class a

protected:

int a;

};class b : public a

void fb(a &a) {cout<

編譯出錯;若將倒數第二行改為

voidfb(b &a){cout<

則編譯執行都沒問題:

保護型別只能被本類中的方法或者派生類訪問,不能被本類的具體物件訪問。a是類a的保護型別成員,能被a中的方法(函式)訪問,能被b類訪問,不能被類a的具體物件a a訪問。

乙個類的保護成員或私有成員只能被該類的成員函式或該類的友元函式來訪問,外部**不能訪問,b類中的函式fb對於a類中的保護成員變數a來說是外部**不能通過該類的物件直接訪問,由於b類公有繼承了a類,a在a類中是保護成員,則在b類中也是保護成員,因此b類中的函式可以訪問自己的保護成員。

訪問控制(相關概述)

訪問控制 訪問控制是指在鑑別使用者的合法身份後,通過某種途徑准許或限制使用者對資料資訊的訪問能力及範圍,阻止未經授權的資源訪問,包括阻止以未經授權的方式使用資源。三個要素 訪問控制包含三個要素,即主體 客體和訪問策略。主體是指乙個發出請求或要求的實體。主體可以是某個使用者,也可以是使用者啟動的程序 ...

informix 的安全訪問控制機制

資料庫安全 資料庫安全是及其重要的,無論使購買產品和歷史分析資料,乙個公司都需要有健全的資料庫安全計畫,通過如下方式來確定 誰可以訪問資料庫伺服器例項和資料庫 從哪兒以什麼方式驗證使用者密碼 使用者的授權級別 使用者能夠執行的命令 使用者能夠讀取或者修改的資料 使用者能夠建立 修改或刪除的資料庫物件...

Linux安全 訪問控制機制 ACM

acm 即access control mechanism acm為系統管理員提供了一種控制哪些使用者 程序可以訪問不同的檔案 裝置和介面等的一種方式。當需要確保計算機系統或網路安全時,acm是乙個主要的考慮因素。acm主要有以下6種方式 1 自主訪問控制 discretionary access ...