專案開發過程中發現乙個問題,有段**,乙個動態庫的cpp**裡不包含標頭檔案中類的空構造空析構實現,就會出現編譯出的動態庫依賴項少了很多。而新增後則多了好幾個依賴項。下面看例子:
1##a.h
2class
a5 ~a(){}
6void
f();
7private:8
t1 t1;
9t2 t2;
10};
1112
##a.cpp
13 #include "
a.h"
14void
a::f()
1516
##b.cpp
17 #include "
a.h"
18int
main()
假設**中的t1、t2都是來自t.so檔案。我們的目的是由a.so依賴t.so,而最終的b.cpp生成的可執行檔案僅僅依賴a.so即可。這樣的需求,是專案開發中很常見,動態庫依賴鏈,清晰簡明。但是上面的**卻沒有達到目的,因為a.so並沒有依賴t.so,而b可執行檔案,稱之為b.out吧,b.out卻需要顯式依賴t.so才能編譯通過。為什麼?當我們嘗試把a類的構造和析構寫在a.cpp中時,就達到了b.out依賴a.so,a.so依賴t.so的目的。
估計你也發現原因了。t1,t2的實現和a.cpp無關。即使用到了t1,t2,但是作為動態庫,執行是在被動態呼叫時候才執行的,編譯期t1,t2來自標頭檔案,不用考慮其實現,故而不需要依賴。而建構函式搬到了cpp中後,構造時候需要對t1,t2實現。
而在專案開發中,這樣的情況很常見,**要更複雜。養成在cpp中實現構造和析構的習慣是有必要的。
C 多個物件構造 析構 構造和析構的順序
include 多個物件構造和析構 1 當類中有成員變數是其它類的物件時,首先呼叫成員變數的建構函式,呼叫順序與宣告順序相同 之後呼叫自身類的建構函式 2 析構函式的呼叫順序與對應的構造函式呼叫順序相反 2 類成員中若有const修飾,必須在物件初始化的時候,給const int n 賦值 當類成員...
c 的構造和析構
因為c 比c語言多了類和物件的概念,類是一群類似的功能的抽象描述,物件則是類的例項化。乙個類包含三種訪問控制屬性,由三種訪問控制符所控制,即分別為public private和protected三種資料屬性。每個屬性又都由各自的成員資料和成員函式 行為 組成。private和protected訪問控...
C 中的構造 析構
知識點 建構函式的呼叫規則 重要 系統會對任何乙個類提供3個函式成員函式 預設建構函式 空 預設析構函式 空 預設拷貝建構函式 淺拷貝 1 如果使用者提供了有參構造 將遮蔽 系統的預設建構函式。data ob1 err 2 如果使用者提供了有參構造 不會遮蔽 系統的預設拷貝建構函式。data ob1...