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

Rao*_*ouL 44 c++ object

这有什么区别:

Myclass *object = new Myclass();
Run Code Online (Sandbox Code Playgroud)

Myclass object = new Myclass();
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*ips 69

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)
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*oît 43

第二个错了!

你可以用

MyClass object;
Run Code Online (Sandbox Code Playgroud)

那可行.

现在,关于如何在这两种可能性之间做出选择,它主要取决于你的物体应该存活多久.看到那里得到彻底的答案.


小智 24

你的第一行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*
Run Code Online (Sandbox Code Playgroud)

第二个是:

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
Run Code Online (Sandbox Code Playgroud)

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

delete myclass;
Run Code Online (Sandbox Code Playgroud)

  • -1:从技术上讲,这不是堆与堆栈,而是动态与自动存储持续时间。这也不是关于“长时间”与“短期”的使用。一个只能在范围内使用,另一个永远不会被自动删除。 (6认同)

Wel*_*bog 13

所述new操作者将指针返回到它创建的对象,所以表达式Myclass object = new Myclass();是无效的.

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


Fre*_*son 8

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

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


Dee*_*tam 7

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

Myclass object=new Myclass();  //Incorrect code
Run Code Online (Sandbox Code Playgroud)

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

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

Myclass *object = new Myclass();  //declares pointer to class.
Run Code Online (Sandbox Code Playgroud)

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

Myclass object;   //declares object of class Myclass
Run Code Online (Sandbox Code Playgroud)

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

pointer_to_class->member;  // accessing class member using pointer to class
object.member;             //accessing class member using object of class 
Run Code Online (Sandbox Code Playgroud)