这有什么区别:
Myclass *object = new Myclass();
和
Myclass object = new Myclass();
我看到很多C++库,如wxWidgets、OGRE等都使用第一种方法...为什么?
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)
如果您计划在很长一段时间内使用它们,则可以创建具有动态存储持续时间(通常在堆上)的对象,并且您可以在较短的生命周期(或范围)内创建具有自动存储持续时间(通常在堆栈上)的对象。
你的第一行是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;
new
运算符返回指向它创建的对象的指针,因此表达式Myclass object = new Myclass();
无效。
其他语言没有像 C++ 这样的显式指针,因此您可以编写类似
Myclass object = new Myclass();
的语句,但在 C++ 中这是根本不可能的。 new Myclass();
的返回类型是指向Myclass
对象的指针,即Myclass *
。
第一个示例创建一个指向 MyClass 的指针,并将其初始化为指向 new 运算符的结果。
第二个可能无法编译,因为它试图创建一个 MyClass 对象并将其分配给 MyClass 指针。如果您有一个接受 MyClass 指针的 MyClass 构造函数,这可能会起作用。
您的第一行代码是正确的,而第二行代码是错误的。
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
第一个是正确的。
第二个通常不会编译。如果它确实编译了,那么该类正在构造函数/赋值运算符中执行一些复杂的操作。它可能会泄漏内存。
有可能 Myclass 名称 = Myclass();