调用带指针和不带指针的构造函数(实例)的区别

Difference between calling out a constructor with pointer and without pointer(instance)

本文关键字:指针 实例 区别 构造函数 调用      更新时间:2023-10-16

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

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

abc a;在堆栈上分配a,调用其默认构造函数。析构函数将在a超出作用域时被调用。

abc* a = new abc();上为abc对象分配内存,调用其默认构造函数并返回指向该对象的指针。记住调用delete a;(它将调用析构函数),否则会泄漏内存。

abc a();是一个名为a的函数原型,它返回一个不带参数的abc

class {
....
}abc;
abc a;
abc *a = new abc();

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

  1. abc a;在这里,对象是在堆栈上分配的(如果在main函数或其他函数中声明它),或者在全局声明它的.data部分中分配。无论哪种情况,内存都是静态分配的;没有内存管理需要担心。
  2. abc *a = new abc();现在你正在为你的对象动态分配内存,你需要自己照顾内存管理,即调用delete()或在你的程序中有内存泄漏。

但是,在实例化对象的两种方式之间还有一个区别:在第二个示例中,您也调用了operator new。它可以被重载,从而产生不同的行为。另外,由于第二个调用涉及到operator new,您可以使用placement new并在您选择的内存位置中分配对象——您不能在第一个示例中这样做。

动态分配可以分为两部分:

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

当您了解了运行时多态性(即:一个类的指针可以存放另一个类的对象)。

注意:你的程序,就像这里写的,不会编译,因为构造函数是私有的。