[甘草][hairetz]我下面这个问题不帮我解释清楚,我就不停地用分砸你们!!!

traceless 2009-12-07 11:46:51
>
COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj; //aobj.m_a = 1


>
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 = bobj,没有我上面那个重载aobj.m_a = 8。这种方式和结构体一样
注:在重载函数中加his->m_a = obj.m_a或者正确的方法我知道。

我是想知道

return obj; //obj是bobj

返回的不是bobj吗
...全文
321 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
firsthym 2009-12-07
  • 打赏
  • 举报
回复
对于代码1:
COP operator=(COP obj)   
{
return obj;
};

COP aobj,bobj;
aobj.m_a = 1;
bobj.m_a = 8;
aobj = bobj; //aobj.m_a = 1
/*
上述代码相当于执行aobj的成员函数:aobj.=(bobj),其作用是你写的return obj,也就是说对于aobj来说什么都没做,所以不会修改aobj.m_a
*/


而对于代码2,则是编译器调用缺省赋值操作符,自动按成员拷贝,所以修改了aobj.m_a

代码3,换成常引用试试:
const &COP COP::Fun(COP &obj)
{
return obj;
}




  • 打赏
  • 举报
回复
http://blog.csdn.net/hairetz/archive/2009/05/03/4145107.aspx

感觉你得补点基础.

stA = Foo(stB); //stA stB都是结构体
stA的成员值就等于stB的成员值,难道类变量不是吗 ??

没错啊,变量值是给到stA了啊,没说不是啊。但是值相等,不等于是同一个东西啊。
问题是你的问题是:返回的是不是stB,自然不是,只是一个形参,也就是局部变量。
traceless 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 whg01 的回复:]
hairetz解释的很清楚了。楼主可以结贴了。
[/Quote]

我午睡了,待会在想想。。。。
traceless 2009-12-07
  • 打赏
  • 举报
回复

1、
>
COP operator=(COP obj)
{
return obj;
};

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


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

3、
>
COP 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


刚才去吃饭太急了,没整好代码,重发
第三个代码:返回副本? 和返回数据结构体不一样吗?
比如说:
stA = Foo(stB); //stA stB都是结构体
stA的成员值就等于stB的成员值,难道类变量不是吗 ??
taodm 2009-12-07
  • 打赏
  • 举报
回复
这充分说明了,一本好点的入门教材有多重要。
whg01 2009-12-07
  • 打赏
  • 举报
回复
hairetz解释的很清楚了。楼主可以结贴了。
pengzhixi 2009-12-07
  • 打赏
  • 举报
回复
他这个情况是无论如何编译器也不会优化的。
Apple_Demo 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]
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

return obj; //obj是bobj

返回的不是bobj吗
答:返回的确实是bobj,可惜是个副本,如果需要返回本体,使用引用。

COP &COP::Fun(COP obj)
{
    return obj;
}

不过这样意义也不大,因为COP obj只是个形参,只有局部作用域,所以考虑这样

COP &COP::Fun(COP &obj)
{
    return obj;
}
[/Quote]
分析的非常好。
cphj 2009-12-07
  • 打赏
  • 举报
回复
COP::Fun(COP obj)
{
return obj;
}
有语法错误,需要加上返回值类型COP或者COP &

obj正常情况下是bobj的副本,但很多编译器会根据情况把它优化掉,在符合优化条件时,obj也可能就是bobj
deng1243 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

return obj; //obj是bobj

返回的不是bobj吗
答:返回的确实是bobj,可惜是个副本,如果需要返回本体,使用引用。

COP &COP::Fun(COP obj)
{
return obj;
}

不过这样意义也不大,因为COP obj只是个形参,只有局部作用域,所以考虑这样

COP &COP::Fun(COP &obj)
{
return obj;
}
陌上花花 2009-12-07
  • 打赏
  • 举报
回复
俺是新手,学习了
cattycat 2009-12-07
  • 打赏
  • 举报
回复
你只返回了个临时对象,并没有修改this指针,最后这个临时对象被析构了。
_JeffreyWu 2009-12-07
  • 打赏
  • 举报
回复
obj不是bobj,它是bobj的一个副本,建议看一下函数参数部分,按值传递
pengzhixi 2009-12-07
  • 打赏
  • 举报
回复
aobj = bobj.Fun(bobj); //你这个和aobj = bobj没什么区别啊。
天之骄子_ 2009-12-07
  • 打赏
  • 举报
回复
longoal 2009-12-07
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
#include <tchar.h>
using namespace std;

class COP
{
public:
COP(void){};
virtual ~COP(){};

COP Fun(COP obj)
{
return obj;
}
COP operator=(COP obj) // 一个不恰当的比喻就是,楼主重载了一个=,但是它实际鸟事都不干,只是返回了一个临时对象
{
// this->m_a = obj.m_a; // 去掉该注释,就正确了.
return obj;
}

// 送给你一个好点的=函数
// const COP& operator=(COP obj)
// {
// m_a = obj.m_a;
// return *this;
// }

int m_a;
};

void fummy(COP obj)
{
cout << _T("fuck ") << obj.m_a << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
COP aobj,bobj, cobj;
aobj.m_a = 1;
bobj.m_a = 8;
fummy(aobj = bobj.Fun(bobj)); // 输出的是8,就是说bobj的成员值确实赋给一个临时对象,但是这个对象不是aobj,楼主的迷糊在这
cout<<"a= "<<aobj.m_a<<endl;// 输出的是1,就是说bobj的成员值没有赋给aobj,楼主迷糊在这点,楼主你仔细看看你的操作符=重载都干什么了?

return 0;
}
longoal 2009-12-07
  • 打赏
  • 举报
回复
.
LeonTown 2009-12-07
  • 打赏
  • 举报
回复
吓了一跳,
原来毕竟还是8嘛。。。
  • 打赏
  • 举报
回复
回楼主,看结果应该肯定是8跟8。
我的编译器结果也都是8.
加载更多回复(20)

64,654

社区成员

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

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