New 可以使用复制构造函数,而 delete 使用析构函数。复制构造函数或析构函数可能是微不足道的。
话虽如此,您很有可能无需担心构造函数/析构函数是否在很长一段时间内都是微不足道的。
new
调用构造函数来构造对象。如果类型构造函数的一个参数T
是一个实例,T
那么它就是一个复制构造函数:您正试图从另一个对象构造一个对象的实例
class Foo
{
public:
Foo(int x) // not a copy constructor
: mX(x)
{ }
Foo(const Foo& inOther) // copy constructor
: mX(inOther.mX)
{ }
private:
int mX;
};
class Bar
{
public:
Bar(int x)
: mX(x)
{ }
// no copy constructor specified.. C++ will build an implicit one for you
private:
int mX;
}
};
Foo a(1); // uses the first constructor (not a copy)
Foo b(a); // uses a copy constructor
Foo c = a; // copy constructor
Foo* d = new Foo(1); // construct a new instance of Foo (not a copy)
Foo* e = new Foo(a); // copy
Bar f(1); // normal constructor
Bar g(f); // IMPLICIT copy constructor
如果您的类没有复制构造函数,例如 Bar,C++ 通常会为您提供一个(除非您有explicit
构造函数或使用 C++11 关键字删除复制构造函数,否则总是为您提供一个)。这个复制构造函数非常简单:它复制类的每个成员。
一个简单的复制构造函数是特殊的。仅当编译器为您隐式创建复制构造函数并且:
- 您班级的所有成员都可以轻松复制
- 您没有任何虚拟方法或虚拟基类
- 您的所有基类都可以轻松复制。
如果你在你的类中指定了一个构造函数,根据定义,这不是微不足道的。Foo 没有简单的复制构造函数,因为它是用户定义的。Bar 有一个隐式复制构造函数,因为它不是用户定义的。隐式复制构造函数是微不足道的,因为复制 mX 是微不足道的(复制 int 是微不足道的)。
类似的规则也适用于析构函数。一个平凡的析构函数遵循相同的规则,并删除
它对你有什么用?该规范列出了一些关于普通构造函数/析构函数的关键行为。特别是,如果你有一个微不足道的构造函数和析构函数,否则你可以做的事情是非法的。然而,它们都非常细微,对于 99.9% 的 C++ 代码开发来说并不重要。它们都处理您可以逃脱不构造或破坏对象的情况。
例如,如果我有一个工会:
union MyUnion {
int x;
ClassA y;
ClassB z;
}
如果 y 和 z 有微不足道的构造函数和析构函数,C+ 将为我编写一个用于该联合的复制构造函数。如果其中一个具有重要的构造函数/析构函数,我必须自己为联合编写复制构造函数。
您可以做的另一件事是快速销毁数组。通常,当您删除一个数组时,您必须确保在每个项目上调用析构函数。如果你能证明每个元素的析构函数是微不足道的,那么你可以跳过销毁元素,只释放内存。 std::vector
在引擎盖下这样做(所以你不必)