C ++拷贝构造函数与重载赋值与构造函数最佳实践?

时间:2015-07-28 20:59:37

标签: c++ copy-constructor

这更像是一个意见/最佳实践问题。

我是C ++的新手,我目前正致力于使用动态分配字符串的程序。我最终得到了构造函数,复制构造函数和重载赋值运算符之间的区别。我还需要为这些对象提供析构函数。

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

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

1 个答案:

答案 0 :(得分:4)

在这种情况下,最佳做法是不自行管理资源。使用标准库(本例中为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::stringstd::mapExam)保证在超出范围时被妥善处理,{{3 }}。所以,如果你使用它:

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。尽可能多地遵守RAII