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

这两个程序的区别在哪呢 硬是没有看出来啊 大家帮忙看看

weishanhu03 发布于 2008-08-05 10:08, 499 次点击
class A
{  public:
    A()
    {
        cout<<"A"<<endl;
    }
    ~A()
    {
        cout<<"~A"<<endl;
    }
};
class B
{
public:
    B(A &a)
    {
        cout<<"B"<<endl;
_a=a;
    }
    ~B()
    {
        cout<<"~B"<<endl;
    }
private:
    A _a;
};
int main()
{
    A a;
    B b(a);
    return 0;
}

class A
{  public:
    A()
    {
        cout<<"A"<<endl;
    }
    ~A()
    {
        cout<<"~A"<<endl;
    }
};
class B
{
public:
    B(A &a):_a(a)
    {
        cout<<"B"<<endl;

    }
    ~B()
    {
        cout<<"~B"<<endl;
    }
private:
    A _a;
};
int main()
{
    A a;
    B b(a);
    return 0;
}
以上两段程序的输出结果怎么会不同呢
1 回复
#2
zerocn2008-08-06 21:36
程序代码:
#include <iostream>
#include <stdlib.h>

using namespace std;
class A
{public:

 A(){ cout<<"A"<<endl; }

 ~A(){ cout<<"~A"<<endl;}
};
class B
{public:
B(A &a){cout<<"B"<<endl; _a=a;}
~B(){cout<<"~B"<<endl;}
private:
    A _a;
};

int main()
{

 {
    A a;
    B b(a);

 }
    system("pause");
    return 0;
}


从第一个程序分析:首先定义了A类的a对象,因此,调用构造函数输出A
                  然后,定义B类的b对象,并调用B(A &a)的构造函数,因为在调用构造函数的时候会对类成员初始化,但因为没有显式的初始化会调用缺省构造函数,因此再次输出A,(初始化是在构造函数的函数体前完成的),然后进行构造函数体的内容输出B和对_a赋值(注意,初始化和赋值是不同的!)。
所以最后结果是
A
A
B

程序代码:
#include <iostream>
#include <stdlib.h>

using namespace std;
class A
{public:

 A(){ cout<<"A"<<endl; }

 ~A(){ cout<<"~A"<<endl;}
};
class B
{public:
B(A &a):_a(a){cout<<"B"<<endl;}
~B(){cout<<"~B"<<endl;}
private:
    A _a;
};

int main()
{

 {
    A a;
    B b(a);

 }
    system("pause");
    return 0;
}


对于第二个程序:首先定义了A类的a对象,因此,调用构造函数输出A
                  然后,定义B类的b对象,并调用B(A &a)的构造函数,因为在调用构造函数的时候会对类成员初始化,但是这次有了显式的初始化_a(a);因此调用的是转换构造函数而不是默认的构造函数,因此没有和上面的程序一样输出A,然后进行构造函数体的内容输出B。
所以最后的结果是
A
B
1