有无调用函数的值不一样,不太明白,谁进来一下帮解释解释

traceless 2009-12-07 09:33:34
#include <Windows.h>
#include <iostream>
using namespace std;

class COP
{
public:
COP(void){};
virtual ~COP(){};
COP operator=(COP obj) //没有这个重载函数或者返回值是COP类型的函数,则输出8,为什么?
{
return obj;
};
int m_a;
};

int _tmain(int argc, _TCHAR* argv[])
{
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj;
cout<<"a= "<<aobj.m_a<<endl; // 注释掉重载函数,则输出8,为什么?
return 0;
}


如上所述,请问为什么
难道又和什么静态编译有关?
...全文
247 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
macrojj 2009-12-07
  • 打赏
  • 举报
回复
因为本来就有个默认拷贝啊。
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 traceless 的回复:]
前面有段代码给错了,晕,没有人看出本来的用意...

是这个
>
C/C++ codeCOP::Fun(COP obj)
{return obj;
}
COP aobj,bobj;
aobj.m_a=1;
bobj.m_a=8;
aobj= bobj.Fun(bobj);//aobj.m_a = 1

那这样aobj.m_a没有被改变吗?

[/Quote]
你这里这样处理,其实是用到了默认拷贝构造函数,是浅拷贝,所以aobj.m_a还是被改为了8啊。
aobj= bobj.Fun(bobj);//aobj.m_a = 1
Fun里把bobj传到形参obj的对象拷贝给返回值接收方aobj,进行了浅拷贝,所以aobj.m_a还是被修改了啊。
traceless 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 pony_maggie 的回复:]
1 如果你没有重载赋值操作符, c++会自动合成一个, 所以你注释掉后,结果是8
2 LZ重载的操作符方法有误,赋值操作符应该返回对左操作数的引用,也就*this
3 LZ重载的操作符是直接返回的aobj的对象副本
[/Quote]
2点和3点说得都晕乎乎。。。
traceless 2009-12-07
  • 打赏
  • 举报
回复
特请甘草和hairetz继续...
traceless 2009-12-07
  • 打赏
  • 举报
回复
前面有段代码给错了,晕,没有人看出本来的用意...

是这个
>
COP::Fun(COP obj)
{
return obj;
}
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj.Fun(bobj); //aobj.m_a = 1


那这样aobj.m_a没有被改变吗?
lucasma.eth 2009-12-07
  • 打赏
  • 举报
回复
1 如果你没有重载赋值操作符, c++会自动合成一个, 所以你注释掉后,结果是8
2 LZ重载的操作符方法有误,赋值操作符应该返回对左操作数的引用,也就*this
3 LZ重载的操作符是直接返回的aobj的对象副本
healer_kx 2009-12-07
  • 打赏
  • 举报
回复
正确的答案就是2楼 taodm的说法啊. 默认的被提供了~
我早看到了,就是看到他说的,我才没有回复的.
traceless 2009-12-07
  • 打赏
  • 举报
回复
再看23楼!!
traceless 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 kostion 的回复:]
引用 22 楼 traceless 的回复:
晕死

正确的解决方法,我知道呀,

我的目的是知道那里为什么不行。

看19楼
[/Quote]

晕死,你那个方法,我知道 ==!!

请看22楼
kostion 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 traceless 的回复:]
晕死

正确的解决方法,我知道呀,

我的目的是知道那里为什么不行。
[/Quote]
看19楼
traceless 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hairetz 的回复:]
引用 11 楼 traceless 的回复:
晕,拒绝误导! 呵呵

hairetz这个家伙呢


楼主莫名呼唤我干嘛?你这里就是刻意提供显式运算重载,不然默认重载运算符会把2个相同类的各自成员变量赋值。
[/Quote]

:) 出现及时呀

恩,相同的类赋值就是把各自成员变量赋值,这点和结构体一样。类变量也是变量。

我不太明白的是以下这两种情况:
>
COP::Fun(COP obj)
{
return obj;
}
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj; //aobj.m_a = 1


>
COP operator=(COP obj)
{
return obj;
}
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj; //aobj.m_a = 1


traceless 2009-12-07
  • 打赏
  • 举报
回复
晕死

正确的解决方法,我知道呀,

我的目的是知道那里为什么不行。
gaodj9999 2009-12-07
  • 打赏
  • 举报
回复
一直关注中,对于这个问题我也比较晕点


希望 各路高手出来解释清楚一些啊。。。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 traceless 的回复:]
晕,拒绝误导! 呵呵

hairetz这个家伙呢 
[/Quote]

楼主莫名呼唤我干嘛?你这里就是刻意提供显式运算重载,不然默认重载运算符会把2个相同类的各自成员变量赋值。
kostion 2009-12-07
  • 打赏
  • 举报
回复

#include <Windows.h>
#include <iostream>
using namespace std;

class COP
{
public:
COP(void){};
virtual ~COP(){};
void operator=(COP obj) //没有这个重载函数或者返回值是COP类型的函数,则输出8,为什么?
{
this->m_a = obj.m_a; //这样改一下
//return obj;
};
int m_a;
};

int main(int argc, char* argv[])
{
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj;
cout<<"a= "<<aobj.m_a<<endl; // 注释掉重载函数,则输出8,为什么?
return 0;
}
maquan 2009-12-07
  • 打赏
  • 举报
回复
“运算符重载”是 C++ 里一个强大的功能,也是一个很容易让人困惑的功能。真是让人又爱又怕。

就比如这个“赋值运算符重载”吧,直观的感觉,“赋值”嘛,总是要对等号左边的那个变量做点什么。可是,事实上,重载后的版本可能做任何事情,也可能什么都不做!
traceless 2009-12-07
  • 打赏
  • 举报
回复
断点跟过了,所以不明白才问的嘛

:)
maquan 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 traceless 的回复:]
你们说的搞得我晕呼呼的

哪本书说有,我看去,电子版的 ?
[/Quote]

看书,还不如下个断点,一步一步 step into 进去看看。

哦,忘了你叫 traceless,hehe
traceless 2009-12-07
  • 打赏
  • 举报
回复
你们说的搞得我晕呼呼的

哪本书说有,我看去,电子版的 ?
traceless 2009-12-07
  • 打赏
  • 举报
回复
晕 你们说的看不明白的说

> 
COP operator=(COP obj) //没有这个重载函数或者返回值是COP类型的函数,则输出8,为什么?
{
return obj;
};

COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj; //aobj.m_a = 1


>
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj; //aobj.m_a = 8


>
COP::Fun(COP obj)
{
return obj;
}
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj; //aobj.m_a = 1


加载更多回复(14)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧