使用指针调用构造函数与不使用指针(实例)之间的区别

时间:2015-07-13 09:40:25

标签: c++

我是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;
}

动态调用它的唯一区别是否相同,例如产生相同的结果?

3 个答案:

答案 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();

在这两种情况下都会调用类构造函数,因为您正在实例化一个对象。但是还有一些其他微妙的差异。

  1. abc a; 这里的对象是在堆栈上分配的(如果你在main或其他函数中声明它),或者在.data部分中,如果你在全局声明它。两种情况都是静态分配内存;没有内存管理可以担心。
  2. abc *a = new abc();现在您正在为对象动态分配内存,您需要自己处理内存管理,即调用delete()或在程序中发生内存泄漏。
  3. 但实例化对象的两种方法之间还有另一个区别:在第二个示例中,您还调用了operator new。哪个可以重载以给你一个不同的行为。另外,因为第二个调用涉及operator new,您可以使用placement new并将您的对象分配到您选择的内存位置 - 您无法使用第一个示例执行此操作。

答案 2 :(得分:0)

动态分配可分为两部分:

abc *a; // doesn't call the constructor
a=new abc(); //calls the constructor

当您了解运行时多态性(即指向类的指针可以容纳另一个类的对象)时,您会发现这种类型的分配更有用。

注意:您编写的程序将无法编译,因为构造函数是私有的。