在尝试理解this answer时,似乎new
can be classified as a "copy constructor"和delete
sometimes as a "trivial destructor"。
我可以找到next to nothing (that I can quickly grasp) on "trivial assignment",除非它是隐式声明的 trivial ,如果它的类没有虚拟成员函数或虚拟基类,并且它的直接基类和嵌入对象有一个简单的赋值运算符“。
我找到了a question on yahoo about implicit declaration,但令我惊讶的是,它没有回答。
在阅读virtual member functions之后,我的大脑很疼。
此外,我是一个猴子看猴子的程序员,所以我要做到这一点的唯一方法就是看它在行动。请使用第一个答案中提供的示例解释上述“琐碎”的定义,std::string
使用new
或delete
或更少的{{1}}有一个简单的赋值运算符明显的原因。
答案 0 :(得分:3)
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 +将为我编写该联合的复制构造函数。如果其中一个有一个非平凡的构造函数/析构函数,我必须自己编写union的复制构造函数。
您可以做的另一件事是快速销毁阵列。通常,删除数组时,必须确保在每个项目上调用析构函数。如果你能证明每个元素的析构函数是微不足道的,那么你可以跳过破坏元素,然后释放内存。 std::vector
在幕后做这件事(所以你没必要)