在C ++中实例化对象的不同方法

时间:2009-03-24 14:25:16

标签: c++ object

这有什么区别:

Myclass *object = new Myclass();

Myclass object = new Myclass();

我已经看到很多C ++库如wxWidgets,OGRE等使用第一种方法......为什么?

8 个答案:

答案 0 :(得分:65)

Myclass *object = new Myclass(); //object has dynamic storage duration (usually is on the heap)
Myclass object; //object has automatic storage duration (usually is on the stack)

如果计划在很长一段时间内使用它们,并且创建具有自动存储持续时间(通常在堆栈上)的对象的生命周期很短(或范围),则可以创建具有动态存储持续时间的对象(通常在堆上)

答案 1 :(得分:39)

第二个错了!

您可以使用

MyClass object;

这将有效。

现在,关于如何在这两种可能性之间做出选择,主要取决于你的对象应该存活多久。请参阅there以获得详尽的答案。

答案 2 :(得分:17)

您的第一行是100%正确的。不幸的是,你不能用c ++中的第二行创建对象。在c ++中有两种方法可以创建/创建一个对象。

首先是:

MyClass myclass; // if you only need to call the default constructor    
MyClass myclass(12); // if you need to call constructor with parameters*

第二个是:

MyClass *myclass = new MyClass();// if you only need to call the default constructor
MyClass *myclass = new MyClass(12);// if you need to call constructor with parameters

在c ++中,如果使用new关键字,则对象将存储在堆中。如果您长时间使用此对象并且如果使用第一种方法,它将非常有用,它将存储在堆栈中。它只能在短时间内使用。 注意:如果您使用new关键字,请记住它将返回指针值。您应该使用*声明名称。 如果使用第二种方法,它不会删除堆中的对象。您必须使用delete关键字自行删除:

delete myclass;

答案 3 :(得分:12)

new运算符返回指向它创建的对象的指针,因此表达式Myclass object = new Myclass();无效。

其他语言没有像C ++这样的显式指针,因此您可以编写Myclass object = new Myclass();之类的语句,但在C ++中这是不可能的。返回类型new Myclass();是指向Myclass对象的指针,即Myclass *

答案 4 :(得分:7)

第一个示例创建一个指向MyClass的指针,并将其初始化为指向new运算符的结果。

第二个可能无法编译,因为它试图创建一个MyClass对象并将其分配给MyClass指针。这可能适用于你有一个接受MyClass指针的MyClass构造函数的不太可能的事件。

答案 5 :(得分:6)

您的第一个代码行正确,而第二个代码行不正确。

Myclass object=new Myclass();  //Incorrect code

上面的代码不正确,因为 new Myclass(); 返回指向class和 Myclass对象的指针; 声明了类的对象,并且您正在尝试将指向类的指针指定给类的对象,这是不正确的。

您的第一个代码行是正确的。但这会声明指向class的指针而不是类的对象。

Myclass *object = new Myclass();  //declares pointer to class.

要声明类的对象,您应该编写以下代码。

Myclass object;   //declares object of class Myclass

但是你应该注意到使用指向类的指针和使用类的对象来访问类成员的方式是不同的。以下是访问类成员的代码。

pointer_to_class->member;  // accessing class member using pointer to class
object.member;             //accessing class member using object of class 

答案 6 :(得分:3)

第一个是正确的。

第二个通常不会编译。如果它确实编译,那么类在构造函数/赋值运算符中执行一些复杂的操作。它可能会泄漏记忆。

答案 7 :(得分:-1)

可能 Myclass名称= Myclass();