一个有关赋值运算符重载的小问题,帮忙看看两种方式有区别吗?

chxy85 2010-09-07 06:58:02

struct st
{
public:
int a;
int b;
//方法一
void operator=(st*te)
{
if (this == te)
return;
memcpy(this,te,sizeof(st));
}
//方法二
void operator=(st&te)
{
if (this == &te)
return;
memcpy(this,&te,sizeof(st));
}
};


编译没错,运行结果也一样,不过有些书说运算符重载不要用指针,不解为什么.
...全文
142 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chxy85 2010-09-08
  • 打赏
  • 举报
回复
嗯,这样做确实无法链式使用,如果仅仅是习惯问题,俺就放心了,起码语法没问题...
hai040 2010-09-08
  • 打赏
  • 举报
回复
这是习惯问题
你完全可以用+号实现*,用*实现-,但这不符合习惯
pengzhixi 2010-09-08
  • 打赏
  • 举报
回复
而且像你重载的返回值也是有问题的,正常来说,int a,b,c;
我们可以a=b=c;这样连着赋值的。如果就你那写法肯定不行
pengzhixi 2010-09-08
  • 打赏
  • 举报
回复
综合1,2楼吧。
chxy85 2010-09-08
  • 打赏
  • 举报
回复
还是有问题,即使是指针,我们完全可以这样调用:

st *a = new st;
st *b = new st;
a->operator=(b);

还是能够正常运行...
chxy85 2010-09-08
  • 打赏
  • 举报
回复
呵呵,谢谢LS的,虽然结果是一样的,确实这样不够直观.....意思不明确

we_sky2008 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 we_sky2008 的回复:]
C/C++ code

//两种方法问题都很大:
//方法一
void operator=(st*te)
{
if (this == te)
return;
memcpy(this,te,sizeof(st));//首先这里sizeof(st)是一个指针的大小,再者operator=不要用memcpy实……
[/Quote]
不好意思,看错了,应该把“首先这里sizeof(st)是一个指针的大小这句”去掉的
我看成sizeof(te)了
we_sky2008 2010-09-08
  • 打赏
  • 举报
回复

void operator=(st*te);//这个接口太不友好了,被赋值的对象是一个st类型的对象,赋值对象却是一个st的指针,容易搞混的
we_sky2008 2010-09-08
  • 打赏
  • 举报
回复

//两种方法问题都很大:
//方法一
void operator=(st*te)
{
if (this == te)
return;
memcpy(this,te,sizeof(st));//首先这里sizeof(st)是一个指针的大小,再者operator=不要用memcpy实现,考虑下派生类指针传递到该函数时的问题,如果有虚函数VPTR也被拷贝成派生类的了
}
//方法二
void operator=(st&te)//最好返回类型为st&,函数体中return *this;
{
if (this == &te)
return;
memcpy(this,&te,sizeof(st));//operator=不要用memcpy实现,考虑下派生类指针传递到该函数时的问题,如果有虚函数VPTR也被拷贝成派生类的了
}

VR_Lab 2010-09-08
  • 打赏
  • 举报
回复
主要是链式的使用
whg01 2010-09-07
  • 打赏
  • 举报
回复
	st a;
st* b = new st;
st c;
a = b; //触发方法1
a = c; //触发方法2

区别就是一个等号后面可以跟指针,一个等号后面可以跟对象。
Jim_King_2000 2010-09-07
  • 打赏
  • 举报
回复
如果operator=()的参数为指针,那么调用就像下面这样:

st *p = ...;
st xxx;
xxx = p;

我们拿st的指针p给st对象xxx赋值,这显然有悖常理。
老邓 2010-09-07
  • 打赏
  • 举报
回复
指针可能为NULL(0),而引用不会!

64,654

社区成员

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

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