注册 登录
编程论坛 C++教室

为什么这样输出?求输出的每句原因!

默默学习 发布于 2011-11-21 22:21, 602 次点击
#include "stdio.h"
#include "iostream.h"

class A
{
public:
    A()
    {
        a=0;
        cout<<"调用A类的无参构造函数A()"<<endl;
    }
    A(int i)
    {
        a=i;
        cout<<"调用A类的带参构造函数A(int)"<<endl;
    }
    ~A()
    {
        cout<<"调用A类的析构函数"<<endl;
    }
    void Print()    const
    {
        cout<<a<<",";
    }
    int Geta()
    {
        return a;
    }
private:
    int a;
};
//用类B继承类A
class B:public A
{
public:
    B()
    {
        b=0;
        cout<<"调用B类的无参构造函数B()"<<endl;
    }
    B(int i,int j,int k);
    ~B()
    {
        cout<<"调用B类的析构函数"<<endl;
    }
    void Print();
private:
    int b;
    A oa;    //父类对象为子类成员变量.
};
B::B(int i,int j,int k)
{
    b=k;
    cout<<"调用B类的带参构造函数B(int,int,int)"<<endl;
}
void B::Print()
{
    A::Print();
    cout<<b<<","<<oa.Geta()<<endl;
}
void main()
{
    B ob[3];
    ob[0]=B(1,2,3);
    ob[1]=B(4,5,6);
    ob[2]=B();
    for(int i=0;i<3;i++)
        ob[i].Print();
    getchar();
}
3 回复
#2
yuccn2011-11-22 12:18
没有为什么
因为爱所以爱
#3
Toomj2011-11-22 12:31
这么多输出语句,谁有时间帮你一句句讲
就是掌握调用顺序就好了,构造函数调用顺序是先基类后派生类,析构是先派生类后基类
#4
我是菜鸟C2011-11-24 10:00
调用A类的无参构造函数A()
调用A类的无参构造函数A()
调用B类的无参构造函数B()//初始化b【0】,构造时先基类后派生类,基类无参执行两次的原因是因为派生类中有一个数据成员A oa还会调用一次无参A();
调用A类的无参构造函数A()
调用A类的无参构造函数A()
调用B类的无参构造函数B()//初始化b【1】
调用A类的无参构造函数A()
调用A类的无参构造函数A()
调用B类的无参构造函数B()//初始化b【2】

调用A类的无参构造函数A()
调用A类的无参构造函数A()
调用B类的带参构造函数B(int,int,int)
调用B类的析构函数
调用A类的析构函数
调用A类的析构函数
调用A类的无参构造函数A()
调用A类的无参构造函数A()
调用B类的带参构造函数B(int,int,int)
调用B类的析构函数
调用A类的析构函数
调用A类的析构函数
调用A类的无参构造函数A()
调用A类的无参构造函数A()
调用B类的无参构造函数B()
调用B类的析构函数
调用A类的析构函数
调用A类的析构函数   //道理同上。
0,3,0
0,6,0
0,0,0      //输出其实是cout<<a<<k<<a<<endl;
1