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;
}
这样也可以避免字符串的复制,编译器通过且正常运行,那么右值引用参数的复制构造函数还有什么用呢?两者功能一样的! 展开
{
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;
}
这样也可以避免字符串的复制,编译器通过且正常运行,那么右值引用参数的复制构造函数还有什么用呢?两者功能一样的! 展开
2个回答
展开全部
你的这种写法固然是能够通过编译的,但是却违背了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=后就会被析构,从而不会导致上面这种奇怪的语义。至于左值、右值的定义,左/右值绑定到左/右值引用的绑定规则你可以上网再仔细看看,会有所体会的。
CMessage& operator=(const CMessage& aMess)的语义是将aMess做为原型copy一份来构造自身,但是不会改变aMess对象。
试想你写出如下代码:
CMessage c1("Hello World"), c2;
c2 = c1;
c1.show();
c2.show();
结果输出是:
<nothing>
Hello World
你不会觉得很奇怪吗?
而右值引用之所以可以修改被copy的原型是因为这个原型是一个右值,它在调用完这个operator=后就会被析构,从而不会导致上面这种奇怪的语义。至于左值、右值的定义,左/右值绑定到左/右值引用的绑定规则你可以上网再仔细看看,会有所体会的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询