回 帖 发 新 帖 刷新版面

主题:请解释这是为什么?

下面这程序其输出 的结果让我弄不懂,请大家指教。在VC6.0下调试。
#include<iostream>
using namespace std;
class B1
{
public:
    B1(int i=0)
    {
        cout<<"Constructing B1"<<i<<endl;

    }
    ~B1()
    {
        cout<<"Destructing B1"<<endl;
    }
};
class B2
{
public:
    B2(int j=1)
    {
        cout<<"Constructing B2"<<j<<endl;
    }
    ~B2()
    {
        cout<<"Destructing B2"<<endl;
    }
};
class C:public B2,public B1
{
public:
    C(int a,int b):memberB2(a),B2(b)
    {
        cout<<"Constructing 我自己"<<endl;
    }
    ~C()
    {
        cout<<"Destructing c"<<endl;
    }
private:
    B1 memberB1;
    B2 memberB2;
};
void main()
{
    C obj(10,20);
}
程序的结果为:
Constructing B220
Constructing B10
Constructing B10
Constructing B210
Constructing 我自己
Destructing c
Destructing B2
Destructing B1
Destructing B1
Destructing B2
Prress any key to continue.
请高手对输出结果一一解答,不胜感激。(另用其它更高版本的VC调试器好像结果还与这个不同。)

回复列表 (共3个回复)

沙发


系统先实例化基类,即B2(b)  自然会调用B2的构造函数  实参为20
再调用B1的构造函数  实参为默认值 0
再根据private中的数据成员的顺序实例化memberB1()默认值,memberB2(a)
最后就是析构了先析构派生类,积累按顺序析构

板凳

但是B1类中没有定义默认构造函数呀。它定义的是带一个参数的构造函数,为什么会调用默认的构造函数呢?

3 楼


调用的是自定义构造函数  当不传入值时  用缺省值

我来回复

您尚未登录,请登录后再回复。点此登录或注册