class first{
int fa,fb;
public:
first();
first(int x,int y);
void display();
};
first::first():fa(0),fb(0){
}
first::first(int x,int y):fa(x),fb(y){
}
void first::display(){
cout<<fa<<" "<<fb;
}
class second{
first f;
int sa,sb;
public:
second();
second(int x,int y,int a,int b);
void display();
};
second::second():sa(0),sb(0){
}
second::second(int x,int y,int a,int b):f(x,y),sa(a),sb(b){
}
void second::display(){
cout<<"The Numbers are ";
f.display();
cout<<" "<<sa<<" "<<sb<<endl;
}
Я прошу прощения, если этот вопрос уже задавался.
Это простой код для демонстрации работы вложенных классов в c ++.
Тем не менее, в классе second
, предмет f
несмотря на то, что он был определен ранее, я могу вызвать конструктор, используя конструктор second
учебный класс.
Как можно вызвать конструктор для уже определенного экземпляра класса?
Предмет first f;
является членом second
, Это означает, что каждый second
содержит first
, Так что в процессе создания second
, first
должен быть создан. Ваш мем-инициализатор f(x,y)
указывает, как именно создать f
при создании second
объект.
Вы смешиваете разные понятия, когда переменная определена в функции:
void foo()
{
Foobar f; // f is defined and default initialized here
Foobar d { 123 }; // d is defined and initialized with 123
}
и объявлен как поле в class
или же struct
:
struct boo {
Foobar f; // f is declared as member of type boo and how it will be
// initialized will be known in boo's constructor
// not here
boo() {} // f is default constructed
boo( int i ) : f { i } {} // f is initialized with i
};
что еще хуже для вас в c ++ 11 вы можете передать параметры конструктору поля вместо:
struct boo {
Foobar d { 123 }; // d would be initialized with 123 if otherwise is not set in boo's constructor
boo( int i ) : d { i } {} // 123 is ignored and d is initialized with i
boo() {} // d { 123 } is used
};
тем не менее, даже если вы передаете параметры в поле, как поле инициализируется, определяется в конструкторе boo.