C++中关于左值引用和右值引用的问题 15

CMessage&operator=(constCMessage&aMess){delete[]pmessage;pmessage=newchar[strlen(aMes... CMessage& operator=(const CMessage& aMess)
{
delete[] pmessage;
pmessage = new char[strlen(aMess.pmessage) + 1];
strcpy_s(this->pmessage, strlen(aMess.pmessage)+1, aMess.pmessage);
return *this;
}
CMessage& operator=(CMessage&& aMess)
{
delete[]pmessage;
pmessage=aMess.pmessage;
aMess.pmessage=nullptr;
return *this;
}
如上代码为CMessage类的左值引用和右值引用的复制构造函数,为避免不必要的复制,可以这样写左值引用参数复制构造函数吗?如下:
CMessage& operator=(CMessage& aMess)
{
delete[]pmessage;
pmessage=aMess.pmessage;
aMess.pmessage=nullptr;
return *this;
}
这样也可以避免字符串的复制,编译器通过且正常运行,那么右值引用参数的复制构造函数还有什么用呢?两者功能一样的!
展开
 我来答
莫名_2008
2014-10-08 · 超过22用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:57.3万
展开全部
你的这种写法固然是能够通过编译的,但是却违背了operator=的语义。
CMessage& operator=(const CMessage& aMess)的语义是将aMess做为原型copy一份来构造自身,但是不会改变aMess对象。
试想你写出如下代码:
CMessage c1("Hello World"), c2;
c2 = c1;
c1.show();
c2.show();
结果输出是:
<nothing>
Hello World
你不会觉得很奇怪吗?
而右值引用之所以可以修改被copy的原型是因为这个原型是一个右值,它在调用完这个operator=后就会被析构,从而不会导致上面这种奇怪的语义。至于左值、右值的定义,左/右值绑定到左/右值引用的绑定规则你可以上网再仔细看看,会有所体会的。
jackwind1987
2013-12-06 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:498万
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式