乙個類作為另乙個類的資料成員

2022-07-13 02:27:10 字數 2004 閱讀 6332

寫程式的時候希望乙個類能夠訪問另乙個類的資料成員(protected, private),例如類a要訪問類b中的資料成員。

1.保持封裝性

可以通過在被訪問的類(b)中定義訪問許可權為public的函式,用來返回資料成員的引用。

2.繼承

當乙個派生類從父類繼承時,父類的所有成員就成為子類的成員,因此可以將被訪問類作為父類被繼承。要注意此時對父類成員的訪問狀態由繼承時使用的繼承限定符決定。

父類許可權  

繼承方式

private

protected

public

private

private    

private

private

protected

private  

protected

protected

public

private

protected

public

3.友元

申明要訪問類為被訪問類的友元。例如類a要訪問類b中的資料成員,在b的建構函式加上friend class a; 宣告a是b的友元,可以直接訪問到b中的所有成員。舉個例子就是:

class

b friend

class

c;

intgetage()

intgetmoney()

intgetgender()

};classa;

int compute(d &testd)

};int

main()

此時b的乙個物件作為a某函式成員的形參,原本通過物件是無法訪問到b中的private和protected成員。還可以宣告b作為a的資料成員,這樣也能訪問到b中所有成員。

當使用後一種方法,乙個類作為另乙個類的資料成員。需要注意:

如果乙個類b的物件作為另乙個類a的資料成員,則在類a的物件建立過程中,呼叫其建構函式的過程中,資料成員(類b的物件)會自動呼叫類b的建構函式。 但應注意:如果類b的建構函式為有參函式時,則在程式中必須在類a的建構函式的括號後面加一「:」和被呼叫的類b的建構函式,且呼叫類b的建構函式時的實參值必須來自類a的形參表中的形參。這種方法稱為初始化表的方式呼叫建構函式。

如:以上面定義的類a為例,在對類a的物件進行初始化時,必須首先初始化其中的子物件,即必須首先呼叫這些子物件的建構函式。因此,類a的建構函式的定義格式應為:

a:: a(參數列0):成員1(參數列1),成員2(參數列2),…,成員n(參數列n)

其中,參數列1提供初始化成員1所需的引數,參數列2提供初始化成員2所需的引數,依此類推。並且這幾個參數列的中的引數均來自參數列0,另外,初始化x的非物件成員所需的引數,也由參數列0提供。

在構造新類的物件過程中,系統首先呼叫其子物件的建構函式,初始化子物件;然後才執行類x自己的建構函式,初始化類中的非物件成員。對於同一類中的不同子物件,系統按照它們在類中的說明順序呼叫相應的建構函式進行初始化,而不是按照初始化表的順序。

另外:訪問的時候還有幾個前提條件

1.被引用的變數所在類必須被完整地定義,而不是只有前向宣告(例如只是一行class a;);

2.被引用的變數必須是引用處可以訪問的。

2.1.訪問變數的語句所在的類被宣告為被訪問的變數所在類的友元類;

2.2.訪問變數的語句所在的函式被宣告為被訪問變數所在類的友元函式;

2.3.被訪問變數被public修飾,且訪問變數的語句所在的類不是被訪問變數所在的類的private繼承派生類;

2.4.被訪問變數被protected修飾,且訪問變數的語句所在的類是被訪問變數所在的類的public繼承派生類;

2.5.訪問變數的語句所在的類定義在被訪問變數所在的類的內部。

現在假設滿足以上前提條件的a類的某個成員函式或成員初始化的語句要引用b類的成員m,

那麼1.當m是a類的靜態成員時,可以通過a::m引用;

2.當m是a類的非靜態成員,且物件a是類a的例項時,可以通過a.m引用。

以上基本包含了所有的情況。

C 乙個類呼叫另乙個類的成員變數 成員函式

有時候,兩個類之間並沒有繼承的關係,但是其中乙個類需要引用另乙個類中的成員變數或者成員函式。怎樣辦到呢?假設已經新建了兩個類a b。class a class b 現在需要在類a的成員函式中呼叫類b的成員變數b nadd b x,使得a nadd與b nadd相加,那麼只需要在類a的.cpp檔案中包...

C 中乙個類成員函式呼叫另乙個類成員的方法

在繼承之外,在c 中乙個類成員函式呼叫另乙個類成員的方法主要有 類的組合,友元類,類的前向宣告,單例模式等,下面主要講講這4種方法的實現 組合通俗來講就是類b有類a的屬性,如宣告乙個person類,再宣告乙個teacher類,person類物件有年齡和姓名成員,而teacher類物件成員也有年齡和姓...

C 乙個類訪問另乙個類的私有成員和保護成員

友元類 class a friend class b private int aa class b public void output cout a.aa endl private a a 使用友元類時注意 1 友元關係不能被繼承。2 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定...