寫程式的時候希望乙個類能夠訪問另乙個類的資料成員(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中的所有成員。舉個例子就是:
classb 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不一定...