琐碎的任务
trivial assignment
在试图理解这个答案时,似乎new
可以归类为"复制构造函数",delete
有时被归类为"微不足道的析构函数"。
我几乎找不到任何东西(我可以快速掌握)"琐碎赋值",除了它"如果它是隐式声明的,如果它的类没有虚拟成员函数或虚拟基类,并且如果它的直接基类和嵌入对象有一个平凡赋值运算符,它是微不足道的"。
我在雅虎上发现了一个关于隐式声明的问题,但令我惊讶的是,它没有回答。
阅读虚拟成员功能后,我的大脑很痛。
此外,我是一个猴子-看-猴子-do程序员,所以我要得到它的唯一方法就是看到它的实际效果。 请以第一个答复中提供的示例解释上述"琐碎"的定义,即std::string
通过使用new
或delete
或出于不太明显的原因而具有微不足道的赋值运算符。
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
引擎盖下执行此操作(因此您不必这样做)
- 有没有任务栏API可以立即应用注册表更改
- 如何创建线程序列以按照启动顺序执行任务?
- C++一个线程如何正确通信其任务已完成?
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- C++ 任务流库入门
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 编写一个读取五个整数并执行一些任务的C++程序
- 任务内部的 OpenMP 任务循环
- 不知道如何在家庭作业任务中实现一件事
- 如何安全地停止 IOCP WSARecv() 任务,并释放 WSAOVERLAPED 结构?
- 为什么我的 FreeRTOS 任务看不到类成员?
- 当前步骤:构建任务.json 文件
- 命令模式 - 使用"weight"执行任务的命令
- 无法删除EXE崩溃后,即使进程未显示在任务管理器中
- 需要帮助来理解我的任务的 QRegularExpression
- xSemaphoreTake 在调用 xSemaphoreGive 后不会恢复任务
- 如果互斥锁被锁定,则安全地跳过任务