一段简单的代码,请写出输出结果。(有关operator+ 和 临时对象)

winnuke 2011-02-28 10:39:59
// 一个简单的模拟string的类
#include <iostream>
#include <string>
using namespace std;

class MyString
{
public:
MyString(const char* pStr)
: m_pStr(NULL)
{
m_pStr = new char[strlen(pStr) + 1];
strcpy(m_pStr, pStr);
}

MyString(const MyString& myStr)
: m_pStr(NULL)
{
const char *pStr = myStr.GetStrBuffer();
m_pStr = new char[strlen(pStr) + 1];
strcpy(m_pStr, pStr);
}

~MyString()
{
delete [] m_pStr;
m_pStr = NULL;
}

MyString& operator += (const MyString& rv)
{
const char *pStr = rv.GetStrBuffer();
char *pTempStr = new char[strlen(m_pStr) + strlen(pStr) + 1];
strcpy(pTempStr, m_pStr);
strcat(pTempStr, pStr);
delete [] m_pStr;
m_pStr = pTempStr;
return *this;
}

const char* GetStrBuffer() const
{
return m_pStr;
}

private:
char *m_pStr;
};

MyString& operator + (const MyString& lv, const MyString& rv)
{
return (MyString(lv) += rv);
}

ostream& operator << (ostream& os, const MyString& myStr)
{
return os << myStr.GetStrBuffer();
}

int main(int argc, _TCHAR* argv[])
{
string stdstra("stdstra");
string stdstrb("stdstrb");
cout << stdstra + stdstrb << endl;
MyString strA("strA");
MyString strB("strB");
cout << strA + strB << endl;
return 0;
}

就这样一段代码,简单模拟了一个String类,但是却在strA + strB的时候卡壳了。
我不解的是operator +()返回的应该是一个临时对象,但是调试中没有发现临时对象的产生,在函数中就直接析构返回了。
请大侠们帮忙分析下,同样的std::string没有问题(返回的时候通过拷贝构造函数成功创建一个临时对象)。
...全文
80 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnuke 2011-02-28
  • 打赏
  • 举报
回复
说白了,返回引用,就只有一个临时对象。返回值,会产生两个临时对象。
还是粗心了:)
winnuke 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]

MyString(lv)//这个是一个匿名的临时对象。
[/Quote]
是的,这个临时对象在return的时候立马析构,我却把其引用返回出去。
原本应该返回一个值,这样c++会再用这个MyString(lv)再创建一个临时对象返回出去。
無_1024 2011-02-28
  • 打赏
  • 举报
回复
就是临时对象惹的祸 好混乱 指针的生命周期 单步调试一下吧
pengzhixi 2011-02-28
  • 打赏
  • 举报
回复
MyString(lv)//这个是一个匿名的临时对象。
winnuke 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]

额,你返回了一个临时对象的引用
[/Quote]

我错了,呵呵。
不该返回一个引用。
返回一个值,才能创建一个临时对象。
pengzhixi 2011-02-28
  • 打赏
  • 举报
回复
额,你返回了一个临时对象的引用
winnuke 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

const MyString operator + (const MyString& lv, const MyString& rv)
{
return (MyString(lv) += rv);
}
[/Quote]

什么问题?
pengzhixi 2011-02-28
  • 打赏
  • 举报
回复
const MyString operator + (const MyString& lv, const MyString& rv)
{
return (MyString(lv) += rv);
}

64,685

社区成员

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

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