琐碎的任务

trivial assignment

本文关键字:任务      更新时间:2023-10-16

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

我几乎找不到任何东西(我可以快速掌握)"琐碎赋值",除了它"如果它是隐式声明的,如果它的类没有虚拟成员函数或虚拟基类,并且如果它的直接基类和嵌入对象有一个平凡赋值运算符,它是微不足道的"。

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

阅读虚拟成员功能后,我的大脑很痛。

此外,我是一个猴子-

看-猴子-do程序员,所以我要得到它的唯一方法就是看到它的实际效果。 请以第一个答复中提供的示例解释上述"琐碎"的定义,即std::string通过使用newdelete或出于不太明显的原因而具有微不足道的赋值运算符。

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 是微不足道的(复制整数是微不足道的)。

类似的规则也适用于析构函数。 一个简单的析构函数遵循相同的规则,并删除

它对你有什么作用? 该规范列出了一些关于普通构造函数/析构函数的关键行为。 特别是,如果你有一个简单的构造函数和析构函数,你可以做一些事情,否则这些构造函数和析构函数是非法的。 但是,它们都非常微妙,对 99.9% 的C++代码开发并不重要。 它们都处理了您可以侥幸不构建或破坏对象的情况。

例如,如果我有一个工会:

union MyUnion {
    int x;
    ClassA y;
    ClassB z;
}

如果 y 和 z 有简单的构造函数和析构函数,C+ 将为我编写该联合的复制构造函数。 如果其中一个有一个非平凡的构造函数/析构函数,我必须自己为联合编写复制构造函数。

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