c++——前向宣告
阿新 • • 發佈:2019-01-28
在C++中有一種使用其他類的方式:前向宣告。這個的用法和#include一個頭檔案的方式很像,但是兩者的使用有很大的區別:
前向宣告以及#include標頭檔案兩者區別:
前向宣告指在A程式中引入新的型別B,但是B並不是一個完整清晰的類,因為我們只知道只是一個B類,但是我們不清楚它的具體函式介面實現以及成員變數;不能定義一個B的型別,只能使用指標和引用的方式;直到後面找到B的定義我們才真正直到B的具體實現,才可以呼叫它的實現方式;
如果直接在程式中#include則可以直接定義這個類;
前向宣告的使用場景以及限制
看起來好像直接新增標頭檔案的方式挺好,提供了全部的介面,但是這樣的代價就是增加了編譯器的編譯工作量,大量匯入的標頭檔案會引起編譯比較慢;並且在兩方迴圈呼叫的情況下,比如A和B相互呼叫對方,在A呼叫B類相關的時候,B類可能還沒有定義好,那麼我們只能進行前向引用,只表明這是B類就好了;
限制情況:
1、不能夠定義B類的物件;
2、只可使用這個類的指標以及引用型別;
3、用於宣告使用型別為形參或者返回型別的函式;
使用示範:
1、通過前向引用減少標頭檔案的匯入,提供編譯的效率;
//A類的標頭檔案
class B;
class A {
A();
~A();
B* func(B&);
}
//A類的cpp檔案
#include "A.h"
#include "B.h"
//直接在程式碼中使用B類的物件以及成員函式、成員變數;
2、避免使用錯誤,以下還是按照上面的例子來實現
//A類的標頭檔案 class B; class A { A(); ~A() { if (B_obj != NULL) { delete B_obj; B_obj = NULL; } }; B* func(B&); B* B_obj; } //A類的cpp檔案 #include "A.h" #include "B.h" //直接在程式碼中使用B類的物件以及成員函式、成員變數;
在上面的呼叫中就會出現問題了,解構函式delete B的物件,但是此時這個物件只是個空殼,我們並不知道具體B的定義,因此會呼叫失敗,出現警告:deletion of pointer to incomplete type 'B_obj'; no destructor called(沒有實踐)
參考引用: