重载等号运算符的疑问,先行谢过

格兰特杨 2004-01-15 11:05:36
#include"iostream.h"
#include"string.h"
class string
{
private:
char *str;
public:
string(char *s="")
{
int length=strlen(s);
str=new char[length+1];
strcpy(str,s);
}
~string(){delete[] str;}
void display(){cout<<str<<endl;}
string &operator=(string &s)
{
delete str;
int length=strlen(s.str);
str=new char[length+1];
strcpy(str,s.str);
return(*this);
}
};
问题:重载运算符=时s是代表什么?是this的一个copy吗?如果是的话为什么delete this->str后s.str还可以用?或者s有别的意义...?

Thanks.
...全文
82 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
transformers 2004-01-15
  • 打赏
  • 举报
回复
不在于等号右边的,而在于等号左边的和"this"是什么关系!我觉得这才是你想问的!
qeizi 2004-01-15
  • 打赏
  • 举报
回复
同意 robbit2002(萝卜) 的说法。
string &operator=(string &s)运算符重载函数本身就要返回一个对象,是什么对象呢?只可能是*this。
qeizi 2004-01-15
  • 打赏
  • 举报
回复
to: robbit2002(萝卜)
谢谢你的提醒,确实是的,string s2;然后再用s2=s1才是=运算符重载意义的所在。谢谢!谢谢,不过我意思应该还是清楚的。
robbit2002 2004-01-15
  • 打赏
  • 举报
回复
不写return (*this)当然也可以收到赋值的效果,为了它更好的应用应该返回调用对象的引用,
例如:a=b=c;
像这样的操作,如果不写return (*this)就会报错.
在内部类型的赋值操作中都是返回对象的引用,所以我们要与它一致.
格兰特杨 2004-01-15
  • 打赏
  • 举报
回复
我对this指针的理解还是没什么可怀疑di...:)
robbit2002 2004-01-15
  • 打赏
  • 举报
回复
to qeizi:
string s2=s1;....
这个调用应该是调用拷贝构造函数,正常的赋值语句才调用string &operator=( string &s )
这个函数.
格兰特杨 2004-01-15
  • 打赏
  • 举报
回复
基本收到,那么讨论一下:
如果不写return (*this)是否也可以收到赋值的效果?
robbit2002 2004-01-15
  • 打赏
  • 举报
回复
看来你对this指针不清楚,
this指针:它是指向调用成员函数的那个对象。它是成员函数的一个隐形指针,指向调用它的那个对象。
你的问题中:s的引用是函数的一个参数,而不是它的this指针。
例如:
string a;
string b;

a=b;
在这个函数调用中,this指针指向的是a,而s的引用就是指向的b.
明白没?
qeizi 2004-01-15
  • 打赏
  • 举报
回复
string &operator=( string &s )中的s代表*this所要赋值的右值,也就是相当于如果你已经生成一个对象,那么用另一个对象(string对象)来给这个对象赋值,那么就可以用重载的=来进行操作了。因为=是一个二元运算符,那么放在类里面的话就要取一个参数做为非静态成员函数。如string s1;
string s2=s1;....
在这里,s2=s1相当于s2.operator=(s1)。也就是你上面所重载的=运算符了。这样做可以使你自己写的类很方便的使用这些常见的运算符而不是函数了。
格兰特杨 2004-01-15
  • 打赏
  • 举报
回复
问题就是:等号右边的那个变量和this是什么关系?
robbit2002 2004-01-15
  • 打赏
  • 举报
回复
所以你之后的问题也就不用回答了
robbit2002 2004-01-15
  • 打赏
  • 举报
回复
s是右值,this指向的是左值,而s的引用指向的是右值,它不是this的拷贝。
阳春面0513 2004-01-15
  • 打赏
  • 举报
回复
s代表等号右边的那个变量

64,648

社区成员

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

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