C++ 复制构造函数 vs 重载赋值 vs 构造函数最佳实践?

C++ copy constructor vs overloaded assignment vs constructor best practices?

这更像是一个 opinion/best 练习题。

我是 C++ 的新手,目前正在开发一个使用动态分配的字符串的程序。我终于明白了构造函数、复制构造函数和重载赋值运算符之间的区别。我还需要这些对象的析构函数。

(我正在构建一个考试对象,其中包含包含 T/F 个答案对象数组的问题对象,每个对象都指向字符串的动态存储)。

这是我的问题:在专业领域,创建这些对象的最佳实践是什么?当我坐在这里思考这个问题时,我可以从用户那里收集信息并将这些值存储在临时位置并使用构造函数实例化问题对象,或者我可以使用复制和赋值方法构建每个对象......我是不知道该怎么办。一种方法比另一种更好吗?我应该构建和测试这三个吗?请帮忙。

这种情况下的最佳做法是不要自己管理资源。使用标准库(在本例中为 std::stringstd::vector/std::map)。类似于:

#include <string>
#include <map>

class Exam {
public:
  std::map<std::string, std::string> questions_;
};

std::string 为您进行资源管理。当它的析构函数被调用时,它会在它后面清理。 std::mapstd::vector.

也是如此

这里的神奇之处在于,所有 3 类 (std::string, std::map, Exam) 中的成员都保证在他们离开时得到妥善处理范围,根据 RAII。所以,如果你像这样使用它:

void foo() {
  Exam e;
  e.questions_["6 x 7 = ?"] = "42";
} // Here, you're guaranteed that all storage for all your questions and answers is disposed.

您不必担心编写构造函数、析构函数或管理堆分配对象。

一般来说,我建议尽量避免在程序中编写 newdelete。如果您需要在不适合容器的用例中进行动态分配,请使用 std::unique_ptrstd::shared_ptr。尽量遵守 Law of Zero