C++这个复制构造函数,怎么调用了2次呢
#include"iostream"usingnamespacestd;classA{public:A(intuu,floatpp){a=uu;b=pp;}A(A&i){...
#include "iostream"
using namespace std;
class A
{
public:
A (int uu,float pp){ a=uu;b=pp;}
A(A & i){cout<<"aaaaaaaaaaaaaaa"<<endl;}
int a;
float b;
};
A ss()
{
A w(5,6.6);
return w;
}
void main()
{
A & u =ss();
cout<<u.a <<endl;
cout<<u.b <<endl;
}而且数值没复制成功,如果采用默认复制构造函数就可以正确复制 展开
using namespace std;
class A
{
public:
A (int uu,float pp){ a=uu;b=pp;}
A(A & i){cout<<"aaaaaaaaaaaaaaa"<<endl;}
int a;
float b;
};
A ss()
{
A w(5,6.6);
return w;
}
void main()
{
A & u =ss();
cout<<u.a <<endl;
cout<<u.b <<endl;
}而且数值没复制成功,如果采用默认复制构造函数就可以正确复制 展开
2个回答
2013-08-08
展开全部
我的vc里只调用了一次,原因是A&u = ss()把ss里的return w所生成的对象直接绑定到了u上,这是不同版本编译器的优化问题。
没复制成功是因为你的复制构造函数里没有完成复制功能的代码。
默认的复制构造函数是把要拷贝对象的整块内存拷到新对象所占用的内存里,所以原对象的数据也一并拷了过来。所以如果你提供了自己的复制构造函数,就得在里面提供相应的,完成复制作用的代码。
#include "iostream"
using namespace std;
class A
{
public:
A (int uu,float pp){ a=uu;b=pp;}
A(A & i){cout<<"aaaaaaaaaaaaaaa"<<endl; <b>a = i.a; b = i.b;</b>}
int a;
float b;
};
A ss()
{
A w(5,6.6);
return w;
}
void main()
{
A & u =ss();
cout<<u.a <<endl;
cout<<u.b <<endl;
}
没复制成功是因为你的复制构造函数里没有完成复制功能的代码。
默认的复制构造函数是把要拷贝对象的整块内存拷到新对象所占用的内存里,所以原对象的数据也一并拷了过来。所以如果你提供了自己的复制构造函数,就得在里面提供相应的,完成复制作用的代码。
#include "iostream"
using namespace std;
class A
{
public:
A (int uu,float pp){ a=uu;b=pp;}
A(A & i){cout<<"aaaaaaaaaaaaaaa"<<endl; <b>a = i.a; b = i.b;</b>}
int a;
float b;
};
A ss()
{
A w(5,6.6);
return w;
}
void main()
{
A & u =ss();
cout<<u.a <<endl;
cout<<u.b <<endl;
}
2013-08-08
展开全部
来分析一下你的程序运行情况。。从main()开始,第一行 A & u =ss();首先调用 ss()函数,在函数里面定义了一个变量w,调用的是2个参数的构造函数。然后返回,看看返回类型,是A,是属于值传递,恰好你做了一个复制构造函数而你需要的是A& 所以编译器会做无关紧要的转换,把A 转换成A& 这样就开始了第一个 A(A & i)然后主函数里面是 A & u = 又一次调用复制构造函数。然后u就 引用了ss 里面生成的值,但是在赋值完成的时候,ss函数就会消亡掉。在ss里面的变量的生存期已经没了,所以呢u引用的内存里面是没有东西或者被更改了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询