调用带指针和不带指针的构造函数(实例)的区别
Difference between calling out a constructor with pointer and without pointer(instance)
我是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();
在这两种情况下都调用类构造函数,因为您正在实例化对象。但是还有其他一些细微的差别。
-
abc a;
在这里,对象是在堆栈上分配的(如果在main函数或其他函数中声明它),或者在全局声明它的.data部分中分配。无论哪种情况,内存都是静态分配的;没有内存管理需要担心。 -
abc *a = new abc();
现在你正在为你的对象动态分配内存,你需要自己照顾内存管理,即调用delete()或在你的程序中有内存泄漏。
但是,在实例化对象的两种方式之间还有一个区别:在第二个示例中,您也调用了operator new
。它可以被重载,从而产生不同的行为。另外,由于第二个调用涉及到operator new,您可以使用placement new
并在您选择的内存位置中分配对象——您不能在第一个示例中这样做。
动态分配可以分为两部分:
abc *a; // doesn't call the constructor
a=new abc(); //calls the constructor
当您了解了运行时多态性(即:一个类的指针可以存放另一个类的对象)。
注意:你的程序,就像这里写的,不会编译,因为构造函数是私有的。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 初始化指向类实例的智能指针并访问其方法
- 为什么我们不在下面给出的代码中使用指针来实例化C++的实体对象?
- 为什么我不能引用指向实例化对象的函数的指针?
- 返回的指针属性中类实例上的矢量属性消失
- 返回 C++ 中的指针实例变量
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 是否可以将指向未实例化的对象的指针用作C++中的变量?
- 将基本实例指针强制转换为派生实例指针是否合法?(实例不是派生实例)
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- 对于多态类型T,如何在没有类型T实例的情况下获得指向T的虚拟表的指针
- 指向类实例的指针
- 可以在指向不同模板类实例的指针之间进行强制转换吗
- 为共享指针C++单独实例化对象
- 为什么不能在实例化对基类的引用的同时实例化指向派生类的指针?
- 使用指针实例化模板类
- 如何使用智能指针实例化对象
- 如何强制一个类只使用智能指针实例
- 当类的指针实例超出范围时不调用析构函数是真的吗?
- 是否可以在类的NULL指针实例上调用方法?