Оператор присваивания в конструкторах - PullRequest
0 голосов
/ 24 июня 2018

Почему я не могу сделать это на моем конструкторе

Person::Person(std:: string tname,int tage):
    name=tname,
    age=tage
{}

Но это прекрасно,

Person::Person(std:: string tname,int tage):
    name(tname),
    age(tage)
{}

Где name - строковая переменная-член, а age - переменная-член int.

??

1 Ответ

0 голосов
/ 24 июня 2018

Вы не можете сделать это, потому что это не синтаксис языка C ++.

Причина, по которой он написан таким образом, заключается в том, что (по крайней мере, для членов класса) инициализатор вызывает конструкторкласс с указанными параметрами.Он не создает типы, а затем присваивает им значения.Весь смысл использования инициализаторов, а не присвоения значений в теле конструктора, состоит в том, чтобы избежать двойного шага построения объекта, а затем присвоить ему значение.

Если у вас есть 3 класса A, B и C, где C имеет члены a типа A и b типа B, тогда этот конструктор:

C() :
  a(1234),
  a(4567)
{
}

будет эквивалентен следующему коду внекласс:

A a(1234);
B b(4567);

В то время как этот конструктор:

C()
{
   a = 1234;
   b = 4567;
}

Эквивалентен:

A a; // default construct a
B b; // default construct b
a = 1234;
b = 4567;

В этих простых случаях компилятор, вероятно, оптимизирует эти небольшиеразличия, но для более сложных объектов-членов конструкция по умолчанию с последующим присваиванием может быть дорогой или даже невозможной (например, если у объекта-члена нет конструктора по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...