gpt4 book ai didi

c++ - 琐碎的任务

转载 作者:行者123 更新时间:2023-11-28 00:41:25 25 4
gpt4 key购买 nike

试图理解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"除了“平凡如果它被隐式声明,如果它的类没有虚拟成员函数或虚拟基类,如果它的直接基类和嵌入对象有一个平凡的赋值运算符”。

我找到了 a question on yahoo about implicit declaration ,但令我惊讶的是,它没有回答。

看完virtual member functions我的脑袋疼了.

此外,我是一个猴子看猴子做的程序员,所以我要得到它的唯一方法就是看到它在运行。请使用第一个答案中提供的示例解释上述“平凡”的定义,即 std::string 通过使用 new删除或出于不太明显的原因。

最佳答案

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 删除复制构造函数关键词)。这个复制构造函数非常简单:它复制类中的每个成员。

平凡的复制构造函数是特殊的。只有当编译器为您隐式创建复制构造函数并且:

  • 你类(class)的所有成员都可以轻松复制
  • 您没有任何虚拟方法或虚拟基类
  • 您的所有基类都可以轻松复制。

如果您在您的类中指定一个构造函数,根据定义,这不是微不足道的。 Foo 没有简单的复制构造函数,因为它是用户定义的。 Bar 有一个隐式复制构造函数,因为它不是用户定义的。隐式复制构造函数是微不足道的,因为复制 mX 是微不足道的(复制 ints 是微不足道的)。

类似的规则适用于析构函数。平凡的析构函数遵循相同的规则,并删除

它对你有什么作用?该规范列出了一些关于普通构造函数/析构函数的关键行为。特别是,如果您有一个普通的构造函数和析构函数,否则您可以执行的操作列表是非法的。然而,它们都非常细微,并且对于 99.9% 的 C++ 代码开发来说并不重要。它们都处理在不构造或不破坏对象的情况下可以逃脱的情况。

例如,如果我有一个 union :

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

如果 y 和 z 有平凡的构造函数和析构函数,C+ 会为我为那个 union 写一个复制构造函数。如果其中一个具有非平凡的构造函数/析构函数,我必须自己为 union 编写复制构造函数。

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

关于c++ - 琐碎的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18711066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com