在下面簡單的兩類在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
?
在下面簡單的兩類在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
?
您可以即時創建對象。任何C++程序都會一直這樣做。這樣的對象被稱爲臨時對象。
雖然你不能接受臨時地址。所以&B(5)
是非法的。如果您嘗試編譯此代碼,您的編譯器會告訴您。
你在做什麼編譯,但它是錯的!該對象將立即創建並銷燬,除非您將其複製到構造函數中,這是一種浪費。
做到這一點(in Qt, for instance,請參閱「插入數據」)的典型方法是使用指針(我不鼓勵這種,請閱讀下文):
C c = C(new B(5));
這是安全的,但是危險的,因爲你將不得不自己釋放那段記憶。因此,您應該考慮使用unique_ptr
或shared_ptr
。
這在Qt中是可以的,這是因爲Qt以不同的方式管理內存。 C
將是B
對象的父,並在其本身被銷燬時將其刪除。
這並不危險,但通常使用'new'在堆上創建對象並使用'delete'銷燬它們。它始終在代碼中發生。您將學習如何在每個C++課程中正確使用它們。 – JHBonarius
@ J.H.Bonarius這是有史以來最糟糕的做法。千萬不要在面試中說出你在這裏所說的話,這是我對你的建議。再次:瞭解智能指針。 –
@ J.H.Bonarius Btw,我注意到你是一名嵌入式工程師。請注意,我們正在討論C++,而不是C。在嵌入式系統中,一切都不一樣。如果你有C++,並且你有「析構函數」的概念工作正常,那麼你不應該手動刪除對象。 –
即使可以,它也會導致未定義的行爲。程序可能會或可能不會工作,這取決於不可預測的情況。
您可以通過編寫一些代碼在C++中用文本編輯器創建一個類。一個C++程序不能創建一個類。它創建**對象**。請了解區別並使用正確的術語。 –
就你而言,你會得到一個即將被破壞的臨時對象的地址。因此這將是有風險的。 – skypjack
我想這是合法的,但毫無意義(雙關語意) – slawekwin