加号与等号运算符重载

kejie1235 2012-10-17 09:30:03
class String
{…
// 赋值函数
String & operate=(const String &other);
// 相加函数,如果没有friend修饰则只许有一个右侧参数
friend String operate+( const String &s1, const String &s2);
private:
char *m_data;
}

String operate+(const String &s1, const String &s2)
{
String temp;
delete temp.data; // temp.data是仅含‘\0’的字符串
temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];
strcpy(temp.data, s1.data);
strcat(temp.data, s2.data);
return temp;
}

1 为什么返回temp的对象 ? 而不是temp的引用
String & String::operate=(const String &other)
{
if (this == &other)
return *this;
delete m_data;
m_data = new char[strlen(other.data)+1];
strcpy(m_data, other.data);
return *this; // 返回的是 *this的引用,无需拷贝过程
}

这个例子作为 1的参考,为什么+重载符需要重新定义一个临时变量temp,而=重载符却直接用类的m_data ?

2 为什么不释放掉new出来的动态内存 ?
3 对于一个类的其中的一个数据成员new,该怎么delete?delete后 那不是对类不是动态分配的成员delete了。书上讲的都是基础数据类型malloc的实例 ,对类中不是动态分配的成员该怎么办? 那不是 把类的所有成员都删了 ?
分数不是重点,希望大家一起探讨探讨 求解答。
...全文
785 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
realmagician 2013-03-13
  • 打赏
  • 举报
回复
引用 4 楼 kejie1235 的回复:
恩,谢谢。我懂了,但还是有些问题,在加号运算符重载中,temp.data = new char[strlen(s1.data) + strlen(s2.data) +1]; 是动态分配出来的,为什么不能返回呢? 就算temp是在栈中存储的,可是他指向动态分配的内存啊。应该可以返回的。 比如: char* func(char *str) { ……
这样是可以返回的
HAN-Kai 2012-10-18
  • 打赏
  • 举报
回复
补充下2、3问。
delete m_data;

这句其实就是delete 上一次new出来的内存空间。只是没有直接在new完之后delete,那样的话,这部分new出来的空间,你就不能传出去用了。所以在每次重新new之前把上一次new的delete掉。
这样你可能会产生一个疑问,那不是最终会有一个new出来的空间占用着内存。是的,会的。但是这部分内存会在你的程序结束的时候释放掉的。不用担心。
sublimepan 2012-10-18
  • 打赏
  • 举报
回复
1、operator+操作符如果返回引用,那么a+b = c就合法了,这与内置类型操作不一致,所以不返回引用。
2、看析构函数
3、new和delete成对使用
你说的
delete后 那不是对类不是动态分配的成员delete了
没听明白。
kejie1235 2012-10-18
  • 打赏
  • 举报
回复
恩,谢谢。我懂了,但还是有些问题,在加号运算符重载中,temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];
是动态分配出来的,为什么不能返回呢? 就算temp是在栈中存储的,可是他指向动态分配的内存啊。应该可以返回的。
比如: char* func(char *str)
{
str = (char *)malloc( sizeof(char *) * 100 );
return str;
}

小观观 2012-10-17
  • 打赏
  • 举报
回复
1.temp是一个局部变量,它在栈内开辟空间,返回其引用是错误的,因为返回后temp变量会释放,该别名无法正确找到“指向”的对象,就像指针一样,返回一个局部变量的地址是不可靠的。调用“=”运算符重载函数时,存在两个参数,一个是等号左侧参数,一个是等号右侧参数,如 b = c 表达式中若b是为初始化的,则系统调用拷贝构造函数为b赋值,如b的成员是有值得,则调用运算符重载函数,因此可以直接调用它的m_data成员。

64,649

社区成员

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

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