2012-03-22 65 views
1

以下兩種從實例調用函數的方式是否有區別?哪個更好?是否使用指針

Motor M; 
    M.moveToPosition(Speed, TargetPosition); 

    Motor *M; 
    M->moveToPosition(Speed, TargetPosition); 

謝謝!

+5

你試過第二次了嗎?!解引用未初始化的指針就是UB,如果這樣運行沒有問題,我會感到驚訝。 – 2012-03-22 14:09:13

+0

編譯不知何故 – 2012-03-22 14:12:46

+0

@ Marwan Dessouki確實編譯,但它不會按預期運行。 – 2012-03-22 14:13:16

回答

4

你的第二個版本有Undefined Behavior,因爲指針是未初始化的!

您可以動態分配Motor類型的對象(即它分配在堆上):

Motor *M = new Motor; 
M->moveToPosition(Speed, TargetPosition); 
... 
delete M; 

Smart Pointers將幫助您避免必須記住要刪除堆中分配的對象。

至於哪個更好,恐怕這取決於上下文。除非你有相反的理由,否則通常在C++中,你應該首選自動對象(在堆棧上)到動態對象(在堆上)。

+2

通過智能指針(std :: unique_ptr)指向M會更好。 – 2012-03-22 14:11:56

+0

@MarcinHoppe:當我評論時,我正在添加那篇文章(以及更多)的方式:) – 2012-03-22 14:13:58

2

第一種方法將調用Motor構造函數;第二種方法不會,指針將被初始化。

在C++中,儘可能遠離指針。在這裏使用第一種方法。

如果您要動態分配馬達,使用此:

std::unique_ptr<Motor> M(new Motor); 
M->moveToPosition(...); 
0

這是相同的,但使用指針,你能夠動態地創建和銷燬對象(即在循環),執行操作任意數量的對象,利用多態性等等。

+0

...並且如果你不是非常謹慎的話,可以獲得一些非常酷的內存泄漏! :) – hochl 2012-03-22 15:08:01

+0

「隨着強大的...」 – Alexander 2012-03-22 15:19:27

+0

「..來了很大的內存泄漏?」 ^^ – hochl 2012-03-22 15:20:17