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

问题描述 投票:0回答:8

这有什么区别:

Myclass *object = new Myclass();

Myclass object = new Myclass();

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

c++ object initialization
8个回答
83
投票
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)

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


57
投票

第二个错了!

您可以使用

MyClass object;

那会起作用的。

现在,关于如何在这两种可能性之间进行选择,主要取决于你的对象应该存活多久。请参阅那里以获得完整的答案。


36
投票

你的第一行是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;

15
投票

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

其他语言没有像 C++ 这样的显式指针,因此您可以编写类似

Myclass object = new Myclass();
的语句,但在 C++ 中这是根本不可能的。
new Myclass();
的返回类型是指向
Myclass
对象的指针,即
Myclass *


8
投票

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

第二个可能无法编译,因为它试图创建一个 MyClass 对象并将其分配给 MyClass 指针。如果您有一个接受 MyClass 指针的 MyClass 构造函数,这可能会起作用。


6
投票

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

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

上面的代码不正确,因为 new 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 

4
投票

第一个是正确的。

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


-2
投票

有可能 Myclass 名称 = Myclass();

© www.soinside.com 2019 - 2024. All rights reserved.