類可以允許其他類或者函數訪問他的非公有成員,方法是令其他類或者函數成為他的友元(friend)。 友元的聲明: 友元聲明只能出現在類的內部,但是在類內出現的具體位置不限;由於友元不是類的成員,所以不受所在區域訪問控制級別的約束。 友元的聲明並非傳統意義上的聲明,所以為了能夠正確的調用該友元函數,還須 ...
類可以允許其他類或者函數訪問他的非公有成員,方法是令其他類或者函數成為他的友元(friend)。
友元的聲明:
友元聲明只能出現在類的內部,但是在類內出現的具體位置不限;由於友元不是類的成員,所以不受所在區域訪問控制級別的約束。
友元的聲明並非傳統意義上的聲明,所以為了能夠正確的調用該友元函數,還須在類的外面獨立聲明該函數。
令函數作為友元:
如果想要讓一個外部函數add使用類A的非公有成員,可以讓函數add做類A的友元函數,例如:
class A{ friend void add(); //類A的剩餘部分; }
註:因為add()函數是類A的友元函數,所以可以在add()函數的定義中使用類A的非公有成員,但是必須是先定義類A,包括對於add的友元聲明;然後再定義add函數,此時它才能使用類A的成員。
令類作為友元:
如果想要讓類B使用類A的非公有成員,可以讓類B做類A的友元類,例如:
class A{ friend class B; //類A的剩餘部分; }
註:友元關係不存在傳遞性,例:類B是類A的友元類,函數C是類B的友元函數,但是函數C並不能訪問類A的非共有成員。
缺點:這會導致類B中的每個成員函數(包括稍後添加的函數)都可以訪問類A的私有成員,所以,最好只把需要訪問類A私有成員的成員函數聲明為友元。
令成員函數作為友元:
為瞭解決類作為友元的缺陷,我們可以讓特定的類成員函數作為友元,例如:
class A{ friend void B::add(); //類A的剩餘部分; }
註:在把成員函數作為友元時需要註意類A、類B、成員函數add的聲明以及定義順序。
函數重載:
由於重載函數仍然是不同的函數,因此,如果想要把一組重載函數都聲明成友元,則需要對這組函數中的每一個分別聲明,例如:
void add(int arg); void add(double arg); class A{ friend void add(int arg); //類A的剩餘部分; }
只有參數為int的add函數能使用類A的非公有成員。