From: http://blog.csdn.net/xiayefanxing/article/details/7607506
這一陣做項目代碼開發的時候,用到了在一個C++文件中使用另一個類的成員函數的問題,做個小總結。
其中有些是網上搜索的資料,因為比較分散就不一一給出出處了,請作者見諒。
1、C++如何在一個類的成員函數中調用另一個類的成員函數?
假設你想在類A里調用類B的函數int f(x),兩種辦法:
(1)class A::B 也就是說將B定義為A的父類, 這樣你就可以自然的在A里面用f(x)了
(2)class A{
{
B B_ins;
int g(x);
}
int g(x)
{
return B_ins.f(x);
}
在類B的cpp文件中,提供一個全局函數使用類指針調用相應的成員函數,然后在類A的cpp文件中調用這個函數.
也就是說你可以在A里面使用一個B的對象作為成員變量,這樣就可以用他的函數了。
2、C++中定義類的對象:用new和不用new有何區別?
舉個簡單的例子:
class Point{
private: int x;
int y;
public:
void Set(int a,int b)
{ x=a; y=b; }
void Print()
{ cout<<"("<<x<<","<<y<<")"<<endl; }
};
void main()
{
Point p1;
Point *p2=new Point();
p1.Set(1,2);
p2->Set(4,5);
p1.Print();
p2->Print();
delete p2;
}
p1有系統創建並釋放,你不要擔心會出現內存泄露,但是生命期只有在本區域的大括號內,出了大括號就沒用了。P2是指針,要自己釋放,用不好很危險,用好了功能強大,
因為他可以賦值給全局的變量,一下子從局部變量變成全局變量,還能把對象作為函數返回值。
3、類的靜態成員和靜態成員函數
使用static關鍵字聲明的函數成員使靜態的,靜態成員函數同樣也屬於整個類,由同一個類的所有對象共同維護,為這些對象所共享.
作為成員函數,它的訪問屬性可以受到類的嚴格控制,對於公有的靜態函數成員函數,可以通過類名或對象名來調用,但一般情況下建議用對象名來引用靜態函數成員.注意,一般的成員函數只能通過對象名來調用.
由於一個類的靜態成員函數只有一個拷貝,因此它訪問對象的數據何函數使受到樂限制.靜態成員函數可以直接訪問該類的靜態數據成員.而訪問非靜態數據成員,必須通過參數傳遞方式得到對象名,然后通過對象名來訪問.可以看到,通過靜態函數成員訪問非靜態成員使相當麻煩的,一般的使用中,它主要用來訪問全局變量或同一個類中的靜態數據成員,特別是和后者一起使用,達到對同一個類中對象之間共享的數據進行維護的目的.
主要有兩個作用:
a. 管理靜態數據成員;
b. 提供類范圍的功能,即不需要對象來實現的功能
類的靜態成員(變量和方法)屬於類本身,在類加載的時候就會分配內存,可以通過類名直接去訪問;非靜態成員(變量和方法)屬於類的對象,所以只有在類的對象產生(創建類的實例)時才會分配內存,然后通過類的對象(實例)去訪問。
在一個類的靜態成員中去訪問其非靜態成員之所以會出錯是因為在類的非靜態成員不存在的時候類的靜態成員就已經存在了,訪問一個內存中不存在的東西當然會出錯。
C++會區分兩種類型的成員函數:靜態成員函數和非靜態成員函數。這兩者之間的一個重大區別是,靜態成員函數不接受隱含的this自變量。所以,它就無法訪問自己類的非靜態成員。
靜態數據成員
在類中,靜態成員可以實現多個對象之間的數據共享,並且使用靜態數據成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有對象中共享的成員,而不是某個對象的成員。
使用靜態數據成員可以節省內存,因為它是所有對象所公有的,因此,對多個對象來說,靜態數據成員只存儲一處,供所有對象共用。靜態數據成員的值對每個對象都是一樣,但它的值是可以更新的。只要對靜態數據成員的值更新一次,保證所有對象存取更新后的相同的值,這樣可以提高時間效率。
靜態數據成員的使用方法和注意事項如下:
1、靜態數據成員在定義或說明時前面加關鍵字static。
2、靜態成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式如下:
<數據類型><類名>::<靜態數據成員名>=<值>
這表明:
(1) 初始化在類體外進行,而前面不加static,以免與一般靜態變量或對象相混淆。
(2) 初始化時不加該成員的訪問權限控制符private,public等。
(3) 初始化時使用作用域運算符來標明它所屬類,因此,靜態數據成員是類的成員,而不是對象的成員。
3、靜態數據成員是靜態存儲的,它是靜態生存期,必須對它進行初始化。
4、引用靜態數據成員時,采用如下格式:
<類名>::<靜態成員名>
靜態成員函數
靜態成員函數和靜態數據成員一樣,它們都屬於類的靜態成員,它們都不是對象成員。因此,對靜態成員的引用不需要用對象名。
在靜態成員函數的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員。如果靜態成員函數中要引用非靜態成員時,可通過對象來引用。下面通過例子來說明這一點。