конструкторы с ++ - PullRequest
       6

конструкторы с ++

3 голосов
/ 17 июня 2010

я написал этот код:

class A {
  public:
    A(){d=2.2;cout<<d;}
    A(double d):d(d){cout<<d;}
    double getD(){return d;}

  private:
    double d;
};

class Bing  {
  public:
    Bing(){a=A(5.3);}
    void f(){cout<<a.getD();}
  private:
    A a;
};

int main() {
  Bing b;
  b.f();
}

я получаю вывод: 2,2 5,3 5,3 вместо 5,3 5,3. это что-то в конструкторе .... почему я получаю это? как я могу это исправить?

Ответы [ 8 ]

10 голосов
/ 17 июня 2010

Ваш класс A имеет два конструктора: конструктор по умолчанию, который устанавливает d в 2,2, и конструктор, принимающий значение типа double, который устанавливает d в любое значение, которое вы передаете в конструктор.

В вашем классе Bing есть переменная-член типа A.Эта переменная-член инициализируется перед вводом тела конструктора Bing.Поскольку вы не перечисляете элемент Bing в списке инициализатора конструктора, вызывается его конструктор по умолчанию.Вы можете явно инициализировать его с желаемым значением, инициализируя его в списке инициализаторов:

Bing() : a(5.3) { }
5 голосов
/ 17 июня 2010

Это потому, что вы не использовали список инициализации.

Ваш конструктор Bing должен выглядеть следующим образом:

Bing() : a(5.3)
{
}

В предыдущем коде вы создали новый экземплярA (вызывая "конструктор по умолчанию"), затем воздействует на него другой переменной типа A (которая действительно вызывает оператор присваивания).

2 голосов
/ 17 июня 2010

Поскольку вы не инициализируете a в списке инициализации, то вызывается конструктор A по умолчанию.

1 голос
/ 17 июня 2010

Конструктор по умолчанию для A a все еще выполняется в конструкторе для Bing . Даже если вы инициализируете a непосредственно в теле конструктора Bing , конструктор по умолчанию для a уже выполнен в этот момент.

Однако использование списка инициализации для Bing предотвратит выполнение конструктора по умолчанию для a . Измените конструктор по умолчанию Bing на:

Bing(): a(5.3) {}
1 голос
/ 17 июня 2010

Думайте об этом так, вы можете назначать и создавать объекты в C ++. Я немного перефразирую, так что отвяжите меня от слабых языковых адвокатов. :)

Все объекты нуждаются в строительстве, но не каждый нуждается в назначении. C ++ позволяет нам удваивать обязанности и передавать значения через конструктор. В этом случае вы создаете и назначаете за один шаг, как другие предлагают вам сделать.

Если вы просто сконструируете объект, вы получите значение (я) по умолчанию для вашего объекта, когда вызывается c-tor по умолчанию, за которым следуют значения (значения) после присвоения.

1 голос
/ 17 июня 2010

Измените:

    Bing(){a=A(5.3);}

На:

    Bing():a(5.3){}

, и вы получите ожидаемый результат.

Среда выполнения инициализирует конструктор по умолчаниюа затем присвоить ему свою ценность.В моей форме он инициализируется с вашим значением.

0 голосов
/ 17 июня 2010

Как уже упоминалось, вы должны инициализировать элементы A и Bing в соответствующих списках инициализации конструктора. Вы также можете установить для A::d значение по умолчанию, поэтому вам не нужны два конструктора в A. То есть у вас есть:

class A { 
  public: 
    A(){d=2.2;cout<<d;} 
    A(double d):d(d){cout<<d;} 
    double getD(){return d;} 

  private: 
    double d; 
};

Вы можете переписать его как:

class A { 
  public: 
    A(double d=2.2) : d(d) { cout << d; } 
    double getD() { return d; } 

  private: 
    double d; 
};
0 голосов
/ 17 июня 2010

Он печатает 2.2, потому что вы вызываете конструктор A из Bing:

Bing(){a=A(5.3);}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...