C++關於無參數初始化類對象的問題?
01-28
vs2015, debug, x86模式下:
以下代碼:
#include &
#include &
using namespace std;
class A
{
public:
~A()
{
cout &<&< this &<&< endl; cout &<&< value &<&< endl; } int value; }; class B : public A { public: B() : sp(nullptr) { } private: shared_ptr& sp;
};int main()
{
B b;
return 0;
}
運行後是這樣的:
請問大家: 這個A對象是怎麼產生的呢?對象b不是調用nullptr來初始化sp了嗎?為什麼還會產生一個A對象呢?
因為B繼承於A,所以你不能只看到在B的成員shared_ptr&。
在main函數創建B時,即創建子類時,也會創建出來它的父類A,即你看到的A。
你可以把class B : public A 變為 class B,就會有你想像的結果了。
這跟智能指針一點關係也沒有,因為 B 繼承於 A,A 是 B 的子集,所以 A 有的行為 B 也會有,然而你沒有複寫析構函數,所以就會出現這個現象了。
B() : sp(nullptr) { }
中隱含了
B() : A(), sp(nullptr) { }
shared_ptr& sp是一個單獨的數據成員,它和B從A那裡繼承的那個value沒有什麼關係。樓上藍色大大已經解釋的很好了。
派生類對象會包含一個基類對象至於你的B的成員sp跟只是一個可以指向類A對象的一個智能指針,和該對象中包含的A類對象毫無關聯,給它付個初值為什麼其中包含的A類對象就得析構呢更何況B類對象中的A類對象的構造可能在你這個賦初值的代碼後面執行
編譯器會對B類的構造函數進行擴展,增加A類的默認構造函數。
恕我直言啊,這個問題你都沒弄明白就去看智能指針?
推薦閱讀:
※ME是什麼?為啥要有ME?
※稀疏矩陣(sparse matrix)的基本數據結構實現
※深度學習加速策略BN、WN和LN的聯繫與區別,各自的優缺點和適用的場景?
※[5] Python注釋
※這段MIPS程序的CPI如何計算?