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