靜態成員是指聲明為static的類的成員在類的範圍內所有對象共用某個資料。友元是一種定義在類外部的普通函數,但它需要在類的內部進行說明,為了與該類的成員函數加以區別,在說明時前面加上關鍵字friend。友元不是成員函數,但它可以訪問類中的私人成員。其共用提高程式的運行效率。C++語言中的友元函數為在類外訪問類中的私人成員和保護成員提供了方便,但破壞了類的封裝性和隱蔽性。友元可以是一個函數,稱為友元函數,也可以是一個類,稱為友元類。友元函數和友元類統稱友元。
靜態成員
類相當於一個資料類型,當說明一個某類的對象時,系統就為該對象分配一塊記憶體單元來存放類中所有成員。但在某些應中,需要程式中屬於某個類的所有對象共用某個資料。為此,一個解決的辦法就是將所要共用的資料說明為全域變數,但這將破壞資料的封裝性;較好的解決辦法是將所要共用的資料說明為類的靜態成員。
待用資料成員
C++中,同一個類定義多個對象時,每個對象擁有各自的資料成員(不包括待用資料成員),而所有對象共用一份成員函數和一份待用資料成員。待用資料成員是類的所有對象中共用的成員,而不是某個對象的成員,因此可以實現多個對象間的資料共用。待用資料成員不屬於任何對象,它不因對象的建立而產生,也不因對象的析構而刪除,它是類定義的一部分,所以使用待用資料成員不會破壞類的隱蔽性。對待用資料成員的操作和一般資料成員一樣,定義為私人的待用資料成員不能由外界訪問,待用資料成員可由任意存取權限許可的函數訪問。可以在類的成員函數中改變待用資料成員。
待用資料成員不從屬於任何一個具體對象,所以必須對它初始化,且對它的初始化不能在建構函式中進行。類中用關鍵字static修飾的資料成員叫待用資料成員。說明一個待用資料成員的方法與說明一個一般靜態變數一樣,只不過前者是在一個中說明。待用資料成員的使用方法如下:
1-待用資料成員的定義與一般資料成員相似,但前面要加上static關鍵詞。
2-待用資料成員的初始化與一般資料成員不同,待用資料成員初始化的格式如下:
<類型><類名>::<待用資料成員>=<值>;
3-在引用待用資料成員時採用格式:
<類名>::<待用資料成員>
class Class1
{
int a;
static int b;
}c1,c2;
int Class1:;b;
類class1中包含兩個資料成員a和b,其中a為一般資料成員,在對象c1和c2中都存在有各乍的該資料成員的副本;而b是待用資料成員,所有類class1的對象中的該成員實際上是同一變數。C++編譯器將待用資料成員存放在靜態儲存區,該儲存區中的所有資料為類所有對象所共用。
靜態成員函數
靜態成員函數的寶島和其他函數一樣。但在說明時要注意靜態成員函數不得說明為虛函數。靜態成員函數與待用資料成員類似,也是從屬於類,靜態成員函數的定義是在一般函數定義前加上static關鍵字。調用靜態成員函數的格式如:
<類名>::<靜態成員函數名>(<參數表>);
靜態成員函數與待用資料成員一樣,與類相聯絡,不與對象相聯絡,只要類存在,靜態成員函數就可以使用,所以訪問靜態成員函數時不需要對象,如果用對象去調用靜態成員函數,只是用其類型。
靜態成員函數只能訪問待用資料成員、靜態成員函數和類以外的函數和資料。不能訪問類中的非待用資料成員(因為非待用資料成員只有對象存在時才有意義)。但待用資料成員和靜態成員函數可由任意存取權限許可的函數訪問。和一般成員函數類似,靜態成員函數也有訪問機制,私人靜態成員函數不能由外界訪問。靜態成員函數沒有this指標,因此,靜態成員函數只能直接存取類中的靜態成員,若要訪問類中的非靜態成員時,必須藉助對象名或指向對象的指標。
友元
友元提供了在不同類的成員函數之間、類的成員函數與一般函數之間進行資料共用的機制。通過友元,一個普通函數或另一個類中的成員函數可以訪問類中的私人成員和保護成員。友元的正確使用能提高程式的運行效率,但破壞了類的封裝性和資料的隱蔽性。
友元函數
定義友元函數的方式是在類定義中用關鍵詞friend說明該函數,其格式如:
friend <類型><友元函數名>(<參數表>);
友元函數說明的位置可在類的任何部位,既可在public區,也可在protected區,意義完全一樣,友元函數定義則在類的外部,一般與類的成員函數定義放在一起。類的友元函數可以直接存取該類的所有成員,但它不是成員函數,可以像變通函數一樣在任何地方調用。友員函數的定義方法是在類的任何地方像定義其他函數一樣的定義該函數,並在其前面加上關鍵字friend即可。友員函數雖然在類內定義,但它不是這個成員函數,它可以是一個普通函數,也可以是其他類的成員函數,在其函數體中通過對象名訪問這個類的私人或保護成員。
友元類
C++允許說明一個類為另一個類的友元類(friend class)。如果A是B的友元類,則A中所有的成員函數可以像友員函數一樣訪問B類中的所有成員,定義格式如:
class B
{
friend class A: //A的所有成員函數均為B的友元函數
}
友元關係不可以被繼承,假設類A是類B的友元,而類C從類B派生,如果沒有在類C中顯式地使用下面的語句:
friend class A;
那麼,儘管類A是類B的友元,但這種關係不會被繼承到到類C,也就是說,類C和類A沒有友元關係,類A的成員函數不可以直接存取類C的受保護的成員和私人成員。
不存在“友元的友元”這種關係。假設類A是類B的友元,而類B是類C的友元,即是說類B的成員函數可以訪問類C的受保護的成員和私人成員,而類A的成員函數可以訪問類B的受保護的成員和私人成員;但是,類A的成員函數不可直接存取類C的受保護的成員和私人成員,即是說友元關係不存在傳遞性。
友元應用執行個體
求兩數的平方並
#include <iostream.h>
class Myclass
{
private:
int a,b,max,min;
public:
Myclass(int i,int j):a(i),b(j)
{
max=(a>b)?a::b;
min=(a<b)?a::b;
}
friend int Result(Myclass &x);
};
int Result(Myclass&x)
{
return=x.max*x.max-x.min*x.min;
}
void main()
{
Myclass n(3,4)
cout<<Result(n)<<endl;
}