C++關於無參數初始化類對象的問題?

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如何計算?

TAG:編程 | 計算機科學 | C | CC | C11 |