0

在试图理解这个答案时,它似乎new可以归类为“复制构造函数”delete有时也可以归类为“微不足道的析构函数”

我几乎找不到任何(我可以很快掌握的)“琐碎赋值”,除了它是“琐碎的,如果它被隐式声明,如果它的类没有虚拟成员函数或虚拟基类,如果它的直接基类和嵌入式对象有一个简单的赋值运算符”。

在雅虎上发现了一个关于隐式声明的问题,但令我惊讶的是,它没有回答。

读了有关虚拟成员函数的内容后,我的大脑很痛。

此外,我是一个猴子看猴子做的程序员,所以我要得到这个的唯一方法就是看到它的实际效果。请通过使用第一个答案中提供的示例来解释上述“琐碎”的定义,该示例通过使用or或出于不太明显的原因std::string具有琐碎的赋值运算符。newdelete

4

1 回答 1

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+ 将为我编写一个用于该联合的复制构造函数。如果其中一个具有重要的构造函数/析构函数,我必须自己为联合编写复制构造函数。

您可以做的另一件事是快速销毁数组。通常,当您删除一个数组时,您必须确保在每个项目上调用析构函数。如果你能证明每个元素的析构函数是微不足道的,那么你可以跳过销毁元素,只释放内存。 std::vector在引擎盖下这样做(所以你不必)

于 2013-09-10T06:00:00.620 回答