2012-03-22 72 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