C++ конструктор копирования против перегруженного назначения против конструктора лучшие практики?

Это скорее вопрос мнения / передового опыта.

Я новичок в C++, и в настоящее время я работаю над программой, которая использует динамически распределенные строки. Наконец-то я понял разницу между конструкторами, конструкторами копирования и перегруженным оператором присваивания. Мне также нужен деструктор для этих объектов.

(Я создаю объект экзамена, который содержит объекты вопросов, которые содержат массив объектов ответов T/F, каждая из которых указывает на динамическое хранение строк).

Вот мой вопрос: что считается лучшим опытом в профессиональном мире для создания этих объектов? Когда я сижу здесь и думаю об этом, я могу собирать информацию от пользователя и сохранять эти значения во временных местах и ​​создавать экземпляры объектов вопроса с помощью конструктора, или я могу построить каждый объект, используя методы копирования и назначения... не уверен что делать. Один метод лучше, чем другой? Должен ли я собрать и протестировать все три? Пожалуйста помоги.

1 ответ

Решение

Лучшая практика в этом случае - не управлять ресурсами самостоятельно. Используйте стандартную библиотеку (std::string а также std::vector/std::map в этом случае). Что-то вроде:

#include <string>
#include <map>

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

std::string делает управление ресурсами для вас. Когда его деструктор вызывается, он уберется за ним. То же самое касается std::map или же std::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.

вам не нужно беспокоиться о написании конструкторов, деструкторов или управлении объектами, выделенными из кучи.

Как правило, я бы рекомендовал избегать написания new а также delete в ваших программах вообще. Если вам нужно динамическое размещение в сценарии использования, который не подходит для контейнеров, используйте std::unique_ptr или же std::shared_ptr, Постарайтесь соблюдать Закон Ноля как можно больше.

Другие вопросы по тегам