我是c ++的新手,想知道用指针调用构造函数和没有指针之间有什么区别。没有指针我指的是类的实例。
例如:
#include <iostream>
using namespace std;
class abc {
abc() {
cout << "constructor";
}
~abc() {
cout << "destructor";
}
};
int main() {
abc a;
return 0;
}
// VS
int main() {
abc* a = new abc();
delete a;
return 0;
}
动态调用它的唯一区别是否相同,例如产生相同的结果?
答案 0 :(得分:4)
abc a;
在堆栈上分配a
,调用其默认构造函数。当a
超出范围时,将调用析构函数。
abc* a = new abc();
为堆上的abc
对象分配内存,调用其默认构造函数并返回指向该对象的指针。记得调用delete a;
(它会调用析构函数),否则你会泄漏内存。
abc a();
是名为a
的函数的函数原型,它返回abc
,不带任何参数。
答案 1 :(得分:1)
class {
....
}abc;
abc a;
abc *a = new abc();
在这两种情况下都会调用类构造函数,因为您正在实例化一个对象。但是还有一些其他微妙的差异。
abc a;
这里的对象是在堆栈上分配的(如果你在main或其他函数中声明它),或者在.data部分中,如果你在全局声明它。两种情况都是静态分配内存;没有内存管理可以担心。abc *a = new abc();
现在您正在为对象动态分配内存,您需要自己处理内存管理,即调用delete()或在程序中发生内存泄漏。但实例化对象的两种方法之间还有另一个区别:在第二个示例中,您还调用了operator new
。哪个可以重载以给你一个不同的行为。另外,因为第二个调用涉及operator new,您可以使用placement new
并将您的对象分配到您选择的内存位置 - 您无法使用第一个示例执行此操作。
答案 2 :(得分:0)
动态分配可分为两部分:
abc *a; // doesn't call the constructor
a=new abc(); //calls the constructor
当您了解运行时多态性(即指向类的指针可以容纳另一个类的对象)时,您会发现这种类型的分配更有用。
注意:您编写的程序将无法编译,因为构造函数是私有的。