Пустые конструкторы в 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)
{
}