c++高手进!!!!!!!!!

来源:百度知道 编辑:UC知道 时间:2024/05/31 10:47:13
1.
#include <iostream>

using namespace std;

class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i)
{
cout<<"constructed by parameter"<<data<<endl;
}
private:
int data;

};
B Play(B b)
{
return b;
}

int main()
{
B t1=Play(5);
B t2=Play(t1);
return 0;
}

int main()
{
B t1=Play(5);
B t2=Play(10);
return 0;
}
//results:
//constructed by parameter5
//destructed
//destructed
//destructed
// destructed
//results:
//constructed by parameter5
//destructed
//constructed by parameter10
//destructed
//destructed
//destructed

在QQ里面讲比较方便,你发站内信告诉我你QQ就行了

这个问题在于程序先后构造了4个B的对象:
B(5) 这个对象构造时调用了B::B(int i):data(i) 其实它也就是第一次调用B Play(B b) 时构造的临时对象
t1
b 这是第2次调用B Play(B b) 时构造的临时对象
t2
其中后三个的构造都是用的默认的复制构造函数 所以你的默认构造函数 B::B() 没有被调用

class B是指你自定义一个B型的数据类型``B()是构造函数,每次声明一次B型的数据类型时都会运行一次``~B()析构函数,释放B型数据类型时运行一次,B(int i):data(i)是重载构造函数``当与构造函数同时存在是,编辑器可以根据参数的类型来引用正确的构造函数,下面让我们来根据main()函数来分析代码:
1."B t1=Play(5)"这时就声明了t1是B型的数据类型,但是没运行任何一个构造函数
2.载入函数"B Play(B b)"这时声明一个b是B型的数据类型,5是整数参数,相当于B b(5),于是运行B(int i),出现
constructed by parameter5...
3.然后函数运行"return b;"这时释放B型数据类型b,运行
"~B();"出现destructed;
4."B t2=Play(t1)"声明t2是B型的数据类型,不运行任何构造函数
5. 载入函数"B Play(B b)",这时因为t1在前面已经声明了是B型的数据类型,所以t1可以直接代入b不需要声明;
5."return b;"释放B型数据类型b,运行"~B();"出现destructed;
6.main()函数里"return 0",释放t1,t2,,运行两次~B(),,出现两次destructed;
基本上就是这样了```第二个main()中把t1换成10,所以多一