琐碎的任务

时间:2013-09-10 05:05:17

标签: c++ declaration assignment-operator member-functions

在尝试理解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使用newdelete或更少的{{1}}有一个简单的赋值运算符明显的原因。

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在幕后做这件事(所以你没必要)