#include <iostream>
using namespace std;
class A{
public:
int a;
A() {a=0;}
A(int b) {a=b+1;}
};
class B{
public:
A a;
B():a(0) {}
};
int main(void) {
B *b = new B();
cout<<b->a.a<<endl;
return 0;
}
Я заменил B():a(0) {}
на B() {A(0)}
, и вывод изменился с 1 на 0. Мне интересно, в чем разница между ними?
Ага. Но меня не смущает ":", так что это не повторяющийся вопрос.
B() : a(0) {}
явно инициализирует член B::a
значением 0
. Это пример список инициализаторов членов. По сути, a(0)
в этом контексте вызывает конструктор a
с аргументом 0
, который вызывает A::A(int)
, который в вашей реализации добавляет 1
к аргументу и присваивает результат A::a
. Таким образом, в первом случае b->a.a == 1
.
С другой стороны, B() {A(0);}
инициализирует по умолчанию B::a
(потому что A
имеет конструктор по умолчанию) и создает безымянный локальный временный объект A(0);
, который немедленно уничтожается, ничего не меняя. Функционально он эквивалентен B(){}
, который вообще ничего не делает. Вы можете опустить этот тривиальный конструктор, потому что компилятор может неявно сгенерировать его для вас. См. специальные функции-члены для получения дополнительной информации о том, как это работает и при каких условиях. Таким образом, во втором случае вы вызываете конструктор по умолчанию, который устанавливает b->a.a == 0
.
Разве вы не задавали (почти) тот же вопрос несколько часов назад?