2017-02-20 34 views
3

在下面簡單的兩類在C++中,你能創建一個對象作爲arg來運行嗎?

 
class B { 
    private: 
    int i; 
    public: 
    B(int p_i) { i = p_i; }; 
} 
class C { 
    private: 
    B* b; 
    public: 
    C(B* p_b) { b = p_b; }; 
} 

是合法創建B作爲參數傳遞給C()

例如,是

 
C c = C(&B(5)); 

法律,在飛行創造B

+3

您可以通過編寫一些代碼在C++中用文本編輯器創建一個類。一個C++程序不能創建一個類。它創建**對象**。請了解區別並使用正確的術語。 –

+1

就你而言,你會得到一個即將被破壞的臨時對象的地址。因此這將是有風險的。 – skypjack

+1

我想這是合法的,但毫無意義(雙關語意) – slawekwin

回答

4

您可以即時創建對象。任何C++程序都會一直這樣做。這樣的對象被稱爲臨時對象。

雖然你不能接受臨時地址。所以&B(5)是非法的。如果您嘗試編譯此代碼,您的編譯器會告訴您。

2

你在做什麼編譯,但它是錯的!該對象將立即創建並銷燬,除非您將其複製到構造函數中,這是一種浪費。

做到這一點(in Qt, for instance,請參閱「插入數據」)的典型方法是使用指針(我不鼓勵這種,請閱讀下文):

C c = C(new B(5)); 

這是安全的,但是危險的,因爲你將不得不自己釋放那段記憶。因此,您應該考慮使用unique_ptrshared_ptr

這在Qt中是可以的,這是因爲Qt以不同的方式管理內存。 C將是B對象的,並在其本身被銷燬時將其刪除。

+0

這並不危險,但通常使用'new'在堆上創建對象並使用'delete'銷燬它們。它始終在代碼中發生。您將學習如何在每個C++課程中正確使用它們。 – JHBonarius

+0

@ J.H.Bonarius這是有史以來最糟糕的做法。千萬不要在面試中說出你在這裏所說的話,這是我對你的建議。再次:瞭解智能指針。 –

+0

@ J.H.Bonarius Btw,我注意到你是一名嵌入式工程師。請注意,我們正在討論C++,而不是C。在嵌入式系統中,一切都不一樣。如果你有C++,並且你有「析構函數」的概念工作正常,那麼你不應該手動刪除對象。 –

2

即使可以,它也會導致未定義的行爲。程序可能會或可能不會工作,這取決於不可預測的情況。

相關問題