Пустые конструкторы в C++:
в моем коде я делаю следующее, Но я не уверен, что мне "разрешено" или это хорошая техника проектирования. Мне нужно создать пустой конструктор, но мне также нужен конструктор, который инициализирует переменные, заданные параметры. Поэтому я делаю следующее:
это файл С. Н.
class C
{
private:
string A;
double B;
public:
//empty constructor
C();
C(string, double);
}
и мой C.cpp файл:
//this is how I declare the empty constructor
C::C()
{
}
C::C(string a, double b)
{
A = a;
B = b;
}
правильно ли я объявляю пустой конструктор или мне нужно установить A= NULL и B=0.0?
6 ответов
ваш пустой конструктор не делает то, что вы хотите. The double
элемент данных не будет инициализирован нулем, если вы не сделаете это самостоятельно. The std::string
будет инициализирован пустой строкой. Таким образом, правильная реализация конструктора по умолчанию будет просто
C::C() : B() {} // zero-initializes B
что касается другого конструктора, вы должны предпочесть список инициализации:
C::C(const string& a, double b) : A(a), B(b) {}
в противном случае, что вы делаете это задание к построенному по умолчанию объекты.
это нормально сделать и оставить конструктор пустым, но вы должны знать, что неинициализированные поля имеют неопределенное значение. string
- Это класс и его конструктор по умолчанию заботится о его инициализации, но double
не инициализируется здесь (в вашем конструкторе defualt), и его значение не определено (это может быть любое значение, ранее существовавшее в памяти).
а std::string
, вы не можете установить его, чтобы NULL
но может установить пустую строку и std::string
имеет конструктор по умолчанию, который по умолчанию инициализирует его пустой строкой.
C::C()
:B(0.0)
{
}
может быть, вам нужен конструктор конструктор с параметром по умолчанию вместо двух констукторов?
C(const string& a= "", double b= 0.0)
: A(a),
B(b)
{
}
вы единственный человек, кто может ответить на этот вопрос, потому что это зависит полностью о ваших требованиях к объекту, построенному по умолчанию. Поскольку вы не упомянули, что ваши требования, невозможно дать окончательный ответ. Некоторые люди догадаются, что вы должны инициализировать B
до 0, но это решение должно быть основано на вашем дизайне, а не на различных понятиях "хорошей" практики программирования.
вы можете оставить все как есть. Вы можете сделать это, потому что оба string
и double
может быть построен по умолчанию. Это означает, что вы можете сказать string foo;
и не сделать никаких ошибок.
сравните это с тем, что происходит здесь:
class Bar{
private:
Bar(); //Explicitly private;
};
Bar b;
здесь мы получаем ошибку об отсутствии конструктора Bar::Bar()
найден.
Что касается того, хорошая ли это идея: трудно сказать, не зная ситуации, в которой будет использоваться этот класс. Возможно, вполне разумно, чтобы это было в положение "не задано". Но для многих классов, таких как класс, представляющий файл, например, разрешение объекта file, который не указывает на какой-либо файл, очевидно неправильно.
Вы делаете это правильно, и вы можете увидеть его компиляции кода. Конструктор по умолчанию инициализирует строку и double, вызывая их конструкторы по умолчанию. Если вы определяете какой-либо конструктор в своем классе, он скроет конструктор по умолчанию, созданный компилятором для вас.
вы можете улучшить свой код конструктора, написав его следующим образом
C::C(string a, double b):A(a), b(b)
{
}