C++左值、右值及引用

Lionheartch Lionheartch 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
小弟在学习C++lvalue,rvalue引用中遇到一困惑,如下
#include<iostream>
#include"stdlib.h"
using namespace std;
class Cmessage
{
private:
char* pmessage;
public:
Cmessage(const char* text = "default message.")
{
pmessage = new char[strlen(text)+1];
strcpy(pmessage,text);
cout<<"instructor."<<endl;
}
~Cmessage()
{
delete []pmessage;
cout<<"destructor."<<endl;
}
void showit()
{
cout<<pmessage<<endl;
}
Cmessage(Cmessage& amess)
{
pmessage = amess.pmessage;
amess.pmessage = NULL;
cout<<"fuzhigouzao."<<endl;
}
Cmessage& operator=(Cmessage& amess)
{
if(this->pmessage==amess.pmessage)
return *this;
delete [] pmessage;
this->pmessage = amess.pmessage;
amess.pmessage = NULL;
cout<<"overload ="<<endl;
return *this;
}
Cmessage operator+(const Cmessage& amess)const
{
cout<<"overload +"<<endl;
size_t len = strlen(this->pmessage)+strlen(amess.pmessage)+1;
Cmessage message;
message.pmessage = new char[len];
strcpy(message.pmessage,this->pmessage);
strcat(message.pmessage,amess.pmessage);
return message;
}
};
int main()
{
Cmessage text1("text1 message.");
Cmessage text2("text2 message.\n");
Cmessage text3;
cout<<"text3 = text1+text2"<<endl;
text3 = text1+text2; //**************//
text3.showit();
return 0;
}

如上,注释处的赋值为什么还能调用text3.operator=()呢?text1+text2返回值不是应当是右值吗?text3.operator=()的形参是左值引用啊。这里为什么不报错呢?运行结果如下:
instructor.
instructor.
instructor.
text3 = text1+text2
overload +
instructor.
fuzhigouzao.
destructor.
overload =
destructor.
text1 message.text2 message.

destructor.
destructor.
destructor.
...全文

相关推荐

浅谈C++左值引用和右值引用

下面小编就为大家带来一篇浅谈C++左值引用和右值引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38686041

cpp代码-左值 和 右值 ---- 左值引用(就是别名) 和 右值引用

cpp代码-左值 和 右值 ---- 左值引用(就是别名) 和 右值引用

weixin_38646706

C++11中的左值引用和右值引用

1.首先区分左值和右值   左值是表达式结束后依然存在的持久对象   右值是表达式结束时不再存在的临时对象   便捷方法:对表达式取地址,如果能,则为左值,否则为右值   举例:   int a = 10   int b = 20   int *pFlag = &a   vector vctTemp   vctTemp.push_back(1)   string str1 = "hello"   string str2 = "world"   const int &m = 1   请问:a,b,a+b,a++,++a,pFlag,vctTemp[0],100

weixin_38682953

C++左值与右值引用详解[项目代码]

本文详细介绍了C++中的左值与右值引用,包括左值与右值的定义、区别及其在编程中的应用。左值是可以取地址并赋值的表达式,而右值是临时生成的表达式,如字面常量或函数返回值。左值引用和右值引用分别是对左值和右值的别名,右值引用通过移动构造和移动赋值提高了程序效率,减少了不必要的深拷贝。文章还探讨了右值引用的特性,如是否可以修改和取地址,以及左值引用与右值引用的相互转换。最后,介绍了右值引用在移动语义和完美转发中的应用,展示了C++11引入右值引用的重要性和实际价值。

tequila

深入理解C++中的左值引用和右值引用

左值引用和右值引用是C++中非常重要的概念,它们在现代C++编程中扮演着核心角色。通过理解这两种引用类型,我们可以更有效地管理资源,提高程序的性能,并编写出更加灵活和强大的代码。移动语义和通用引用进一步扩展了引用的能力,使得代码更加高效和安全。

2401_85761762
评论 31
收藏 已收藏
分享
返回顶部
Lionheartch
C++ 语言 65,214 成员 250,514 内容