关于构造函数的调用顺序

时间:2020-12-29 19:25:52
#include <iostream>
using namespace std;
class A{public:A(){cout<<"A";}};
class B { public: B(){cout<<"B";}};
class C {public:  C(){cout<<"C";}} ;
class D { public: D(){cout<<"D";}};
class E { public :E(){cout<<"E";}};

class F:A,B
{
   public:
    C c;
    D d;
    E e;
    F():B(),A(),d(),c(),e(){};
} ;
int main ()
{
    F f;
    system("pause");
    
    
}
这个输出ABCDE 不知道为什么;  F():B(),A(),d(),c(),e(){};是什么意思?

12 个解决方案

#1


F():B(),A(),d(),c(),e(){};
初始化参数列表

#2


帮你改一下,如下:

#include  <iostream>
using namespace std;
class A{public:A(){cout <<"A";}};
class B { public: B(){cout <<"B";}};
class C {public:  C(){cout <<"C";}} ;
class D { public: D(){cout <<"D";}};
class E { public :E(){cout <<"E";}};

class F:public A,B
{
public:
    C c;
    D d;
    E e;
    F():B(),A(),d(),c(),e(){};
} ;
int main ()
{
    F f;
    system("pause");


构造函数调用的顺序是,先调用基类的,然后调用自己的。你F继承了A、B,则会先调用A的构造函数,然后调用B的。然后会调用F自己

的。但是F自己的函数体为空,所以什么都没输出。又因为F有三个成员,分别是C、D、E,它们创建的时候,都要调用各自的构造函数,所

以又输出了C、D、E。这样输出就是ABCDE了...

第二个问题,F():B(),A(),d(),c(),e(){};这个叫初始化列表,因为你这个没有参数,所以实际上也没什么用。你可以搜索一下初始

化列表,然后详细看看吧,这不是一句话两句话能说清楚的...

#3


具体解释下呢

#4


看看这个函数
volue(double lv,double wv,double hv):length(lv),wideth(wv),height(hv)
{
  //code 
}

#5


过儿收徒弟吗?

#6


A,B是F的父类,初始化F时首先初始化A,B 所以输出AB,然后按照F内定义的顺序调用C,D,E输出C,D,E

问一下LZ,class F:A,B 不需要写F的权限吗?

#7


class F:A,B //多重继承 先A,再B
{
public:
    C c;//
    D d;
    E e;
    F():B(),A(),d(),c(),e(){};//F类的构造函数,并强行调用父类A,B,的构造函数,d(),c(),e()是初始化对象变量d,c,e  在这里没有实际作用
} ;

#8


引用 5 楼 pengzhixi 的回复:
过儿收徒弟吗?

过儿自己就是菜鸟,收不起徒弟...

#9


引用 8 楼 fetag 的回复:
引用 5 楼 pengzhixi 的回复:
过儿收徒弟吗? 
 
过儿自己就是菜鸟,收不起徒弟...

你要是菜鸟那我就是门外汉了,收了我吧

#10


http://armorleon.spaces.live.com/blog/cns!43c6965893f2d731!415.entry
大家可以学习下

这个版面不错……

#11


首先由于F继承A/B,那么F就一定要实现A B的构造函数,下面这句  F():B(),A(),就是实现A B的构造函数
执行的顺序就以继承的顺序为主,即:class F:A,B ,所以输出A B。
d(),c(),e(){}; 这三个是初始化成员列表。即实现给类F的c,d,e三个变量赋值。
例如  F():d(TEST){};
这里就是将TEST赋值给d,这种方法只能在构造函数中使用
而这里三个函数没有参数所以只是实现这三个变量。所以会执行C,D,E三个的构造函数。全输出C D E

#12


F():B(),A(),d(),c(),e(){};是F的构造函数,构造的顺序是 先F的父类对象的构造函数,然后是F内声明的三个对象的构造函数。

#1


F():B(),A(),d(),c(),e(){};
初始化参数列表

#2


帮你改一下,如下:

#include  <iostream>
using namespace std;
class A{public:A(){cout <<"A";}};
class B { public: B(){cout <<"B";}};
class C {public:  C(){cout <<"C";}} ;
class D { public: D(){cout <<"D";}};
class E { public :E(){cout <<"E";}};

class F:public A,B
{
public:
    C c;
    D d;
    E e;
    F():B(),A(),d(),c(),e(){};
} ;
int main ()
{
    F f;
    system("pause");


构造函数调用的顺序是,先调用基类的,然后调用自己的。你F继承了A、B,则会先调用A的构造函数,然后调用B的。然后会调用F自己

的。但是F自己的函数体为空,所以什么都没输出。又因为F有三个成员,分别是C、D、E,它们创建的时候,都要调用各自的构造函数,所

以又输出了C、D、E。这样输出就是ABCDE了...

第二个问题,F():B(),A(),d(),c(),e(){};这个叫初始化列表,因为你这个没有参数,所以实际上也没什么用。你可以搜索一下初始

化列表,然后详细看看吧,这不是一句话两句话能说清楚的...

#3


具体解释下呢

#4


看看这个函数
volue(double lv,double wv,double hv):length(lv),wideth(wv),height(hv)
{
  //code 
}

#5


过儿收徒弟吗?

#6


A,B是F的父类,初始化F时首先初始化A,B 所以输出AB,然后按照F内定义的顺序调用C,D,E输出C,D,E

问一下LZ,class F:A,B 不需要写F的权限吗?

#7


class F:A,B //多重继承 先A,再B
{
public:
    C c;//
    D d;
    E e;
    F():B(),A(),d(),c(),e(){};//F类的构造函数,并强行调用父类A,B,的构造函数,d(),c(),e()是初始化对象变量d,c,e  在这里没有实际作用
} ;

#8


引用 5 楼 pengzhixi 的回复:
过儿收徒弟吗?

过儿自己就是菜鸟,收不起徒弟...

#9


引用 8 楼 fetag 的回复:
引用 5 楼 pengzhixi 的回复:
过儿收徒弟吗? 
 
过儿自己就是菜鸟,收不起徒弟...

你要是菜鸟那我就是门外汉了,收了我吧

#10


http://armorleon.spaces.live.com/blog/cns!43c6965893f2d731!415.entry
大家可以学习下

这个版面不错……

#11


首先由于F继承A/B,那么F就一定要实现A B的构造函数,下面这句  F():B(),A(),就是实现A B的构造函数
执行的顺序就以继承的顺序为主,即:class F:A,B ,所以输出A B。
d(),c(),e(){}; 这三个是初始化成员列表。即实现给类F的c,d,e三个变量赋值。
例如  F():d(TEST){};
这里就是将TEST赋值给d,这种方法只能在构造函数中使用
而这里三个函数没有参数所以只是实现这三个变量。所以会执行C,D,E三个的构造函数。全输出C D E

#12


F():B(),A(),d(),c(),e(){};是F的构造函数,构造的顺序是 先F的父类对象的构造函数,然后是F内声明的三个对象的构造函数。