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
, Постарайтесь соблюдать Закон Ноля как можно больше.