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

这有什么区别:

Myclass *object = new Myclass();

Myclass object = new Myclass();

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

RaouL asked 2020-07-22T19:17:35Z
7个解决方案
69 votes
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)

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

Joe Phillips answered 2020-07-22T19:18:32Z
42 votes

第二个是错的!

您可以使用

MyClass object;

那可行。

现在,关于如何在这两种可能性之间进行选择,这主要取决于对象应生存的时间。 在那里查看完整的答案。

Benoît answered 2020-07-22T19:18:11Z
23 votes

您的第一行是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;
Vishva Rodrigo answered 2020-07-22T19:19:05Z
13 votes

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

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

Welbog answered 2020-07-22T19:19:30Z
8 votes

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

第二个可能无法编译,因为它试图创建MyClass对象并将其分配给MyClass指针。 如果您有一个接受MyClass指针的MyClass构造函数,则这种情况不太可能发生。

Fred Larson answered 2020-07-22T19:19:55Z
7 votes

您的第一条代码行是正确的,而第二条代码行是错误的。

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

上面的代码不正确,因为新的Myclass(); 返回指向类和Myclass对象的指针; 声明类的对象,并且您试图将指向类的指针分配给类的对象,这是不正确的。

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

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 
Deepak Gautam answered 2020-07-22T19:20:33Z
4 votes

第一个是正确的。

第二个通常不会编译。 如果确实可以编译,则该类将在构造函数/赋值运算符中执行一些复杂的操作。 而且可能是内存泄漏。

Douglas Leeder answered 2020-07-22T19:20:57Z
translate from https://stackoverflow.com:/questions/677632/different-methods-for-instantiating-an-object-in-c