我很抱歉問這樣一個新手問題。 這裏是我的問題:C++方法參數類參考
MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass
的定義:
method(MyClass c);
是否也應該界定?
method(MyClass* c);
我不想複製代碼,什麼是正確的方法?
我很抱歉問這樣一個新手問題。 這裏是我的問題:C++方法參數類參考
MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass
的定義:
method(MyClass c);
是否也應該界定?
method(MyClass* c);
我不想複製代碼,什麼是正確的方法?
你很明顯是一個Java程序員!首先,你需要做的事:
MyClass* c = new MyClass("test");
注意c
是一個「指針MyClass
」 - 這是必要的,因爲new
表達給你的指針動態分配的對象。
現在,要將此函數傳遞給需要參數MyClass
的函數,您需要取消引用指針。也就是說,你會做什麼:
method(*c);
注意,因爲該函數採用MyClass
按值(不是引用),對象將被複制到你的函數。 method
中的MyClass
對象將是您之前分配的對象的副本。參數的類型取決於你想要你的功能做什麼和傳達什麼。如果您想要對該對象進行引用,以便修改該函數內部的對象將修改函數外的對象,則需要使用函數MyClass&
參數 - 對MyClass
的引用。
如果你有說法是MyClass*
型的,那麼你可以簡單地做:
method(c);
這會給你類似的語義傳遞一個參考,因爲指針c
將被複制到函數但是指針所指的對象仍然是動態分配的對象MyClass
。也就是說,如果在修改*d
的函數內部,c
指向的對象也會被修改。
像這樣傳遞一個原始指針通常不是一個很好的方法。該函數必須明確檢查指針是否爲空,否則在某些情況下程序可能會崩潰。如果你想通過引用的語義,使用引用類型 - 這是他們的目的。
但是,最好不要動態分配您的MyClass
對象。我想你只使用new
,因爲你在Java中做了很多。在C++中,new
表達式用於動態分配的一個對象。通常情況下,您不想動態分配對象。這是完全沒有用自動存儲時間,你會做像這樣創建:
MyClass c("test");
method(c);
它被認爲是在C++中,以避免指針和動態分配的,除非你有一個很好的理由非常好的做法。它只會導致更復雜的代碼,更多的空間出現錯誤和錯誤。事實上,您提供的代碼已經存在問題,因爲您沒有delete c;
。當你按照我的建議去做時,你不需要明確地刪除任何東西,因爲對象在超出範圍時會被銷燬。
MyClass *c = new MyClass("test");
method(*c);
它的工作原理,如果你定義的方法類似method(MyClass c)
但是,如果您定義的方法一樣method(MyClass *c);
那麼它應該是
MyClass *c = new MyClass("test");
method(c);
的兩個備選方案都取決於後果你想要用你創建的對象做什麼。
這將導致c的* COPY *被傳入方法。你確定這是正確的做法嗎?這只是一個不好的建議。如果有人問你「我怎麼把這個方形釘放進圓孔裏」,答案不是「用錘子」。答案是「你想要做什麼?」所以在這裏你應該要求OP解釋他實際上想要完成的事情。 –
我同意,但我剛剛下了投票同樣的迴應...... :( –
你想完成什麼?如果你擔心內存,根據你需要的方法嘗試'method(MyClass&c)'或'method(const MyClass&c)'。 – RageD
這取決於你想要做什麼。 –
你的意思是'MyClass * c = new MyClass(「test」);'? –