永发信息网

C++这个复制构造函数,怎么调用了2次呢

答案:2  悬赏:40  手机版
解决时间 2021-05-09 07:46

#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;
}

而且数值没复制成功,如果采用默认复制构造函数就可以正确复制

最佳答案
我的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; a = i.a; b = i.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;
}
全部回答

来分析一下你的程序运行情况。。

从main()开始,

第一行 A & u =ss();

首先调用 ss()函数,在函数里面定义了一个变量w,调用的是2个参数的构造函数。

然后返回,看看返回类型,是A,是属于值传递,

恰好你做了一个复制构造函数

而你需要的是A& 所以编译器会做无关紧要的转换,把A 转换成A& 这样就开始了

第一个 A(A & i)

然后主函数里面是 A & u = 又一次调用复制构造函数。

然后u就 引用了ss 里面生成的值,但是在赋值完成的时候,ss函数就会消亡掉。

在ss里面的变量的生存期已经没了,

所以呢u引用的内存里面是没有东西或者被更改了。

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
紫阳为什么这摸冷啊?
谁能告诉我这是什么意思??CF的~
现在Ehome对SB的Dota比赛怎么看?
求教我无线路由器桥连的方法
疯狂猜成语一排国旗是什么地方,四个字?
修理MP4!急求!
为什么我玩不了反恐精英
想取个关于巨蟹座的英文名
港口曹家我想知道这个在什么地方
CF体验服怎么不给我CF点呢?
山东理科367报考威海职业学院二专几率多大
我的这个配置用深度还系统是雨林木风系统好?
山东到九江怎么走
我爱的人,她不爱我。那我该怎么办?
自贡到泸州开车要多久,请问泸州到自贡怎么走
推荐资讯
宏伟汽修一站式服务中心地址在什么地方,想过
团队游戏需要搜集搞笑的歇后语,大家给我些吧
现实里枚琳凯不打折,那网上打折的枚琳凯是正
QQ三国职业技能书都怎么可以得到? (0-80)
悲 伤 、是 什 么 。
盗版系统怎么用IE8
超级QQ咋升级
by2哪首歌好听
42级狂战带啥图挣钱快
中国工商银行吴忠支行怎么去啊,有知道地址的
大驰汽修地址在哪,我要去那里办事
若定义一个4人团队为小说故事的主角,怎么能
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?