關於類成員函式中訪問同類物件的私有成員

2021-08-27 12:55:13 字數 3253 閱讀 7748

原址:

(注釋: 為了尊重原作者,在不改變內容的前提下,我進行了格式和內容的編輯,增強閱讀體驗。這位兄弟的文章,挺全面的,不過也有一點囉嗦。好像這個文章的上傳作者也在杭州工作,有機會聯絡下,一起討論交流下c++的一些知識。)

關於類成員函式中訪問同類物件的私有成員,主要包含以下幾種場景:

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

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

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

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

舉例描述上述知識:

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

class point

point(point &p);

private:

int x,y;

};point::point (point &p)

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

class a

void seta(int val)

void assign(a& _aa)

void display()

private:

int a;

};3).

#include

using namespace std;

class testclass

void useprivatemember()

private:

int _amount;

};

4).

#include

using namespace std;

class testclass

void useprivatemember()

private:

int _amount;

};

int main()

關於該問題(知識點)的討論和或解釋: 1.

私有是為了實現「對外」的資訊隱藏,或者說保護,在類自己內部,有必要禁止私有變數的直接訪問嗎?

難道還要讓我們宣告乙個類為自身的友元?

point::point(point &p)

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

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屬性不發生改變;

如下所示:

class a

protected:

int a;

};class b : public a

void fb(a &a)

};編譯出錯;

若將fb成員函式改為 :

void fb(b &a)

則編譯執行都沒問題:

保護型別只能被本類中的方法或者派生類訪問,不能被本類的具體物件訪問。

a是類a的保護型別成員,能被a中的方法(函式)訪問,能被b類訪問,

不能被類a的具體物件訪問。

乙個類的保護成員或私有成員只能被該類的成員函式或該類的友元函式來訪問,外部**不能訪問。

b類中的函式fb,對於a類中的保護成員變數a,是外部**不能通過該類的物件直接訪問。

由於b類公有繼承了a類,a在a類中是保護成員,則在b類中也是保護成員,因此b類中的函式可以訪問自己的保護成員。

關於類成員函式中訪問同類物件的私有成員

原址 關於類成員函式中訪問同類物件的私有成員,主要包含以下幾種場景 a 在c 的類的成員函式中,允許直接訪問該類的物件的私有成員變數。b 在類的成員函式中可以訪問同型別例項的私有變數。c 拷貝建構函式裡,可以直接訪問另外乙個同類物件 引用 的私有成員。d 類的成員函式可以直接訪問作為其引數的同型別物...

關於類成員函式中訪問同類物件的私有成員

關於類成員函式中訪問同類物件的私有成員,主要包含以下幾種場景 a 在c 的類的成員函式中,允許直接訪問該類的物件的私有成員變數。b 在類的成員函式中可以訪問同型別例項的私有變數。c 拷貝建構函式裡,可以直接訪問另外乙個同類物件 引用 的私有成員。d 類的成員函式可以直接訪問作為其引數的同型別物件的私...

C 類中對同類物件private成員訪問

本文 私有成員變數的概念,在腦海中的現象是,以private關鍵字宣告,是類的實現部分,不對外公開,不能在物件外部訪問物件的私有成員變數 然而,在實現拷貝建構函式和賦值符函式時,在函式裡利用物件直接訪問了私有成員變數,因而,產生了困惑 下面以具體例項進行說明 疑惑 為什麼第26行和第32行 可以編譯...