C++11右值引用
来源:互联网 发布:女权运动 知乎 编辑:程序博客网 时间:2024/06/04 19:40
C++左值和右值的理解:(右值引用详解和深入理解右值引用)
C语言的左值右值由赋值运算符(=)决定;
C++的左值、右值由表达式决定:表达式结束后依然存在的对象,右值表达式结束后就不存在的临时对象。
(对对象取地址,能取到地址的就是左值,不能取到地址的就是右值)
c++11支持std::move()把左值对象切换成右值对象。
C++11右值引用:
形如typeName&& object;声明对象的方式通常都是右值引用,除了&&做模板参和auto&&自动类型推导时
有可能是右值也有可能是左值。
右值引用也分const右值引用和非const右值引用:
非常量右值引用只能绑定到非常量右值;
常量右值引用可以绑定到非常量右值和常量右值;
左值引用:
非常量左值引用只能绑定到非常量左值;
CMyString cs2(std::move(cs1)); // CMyString(CMyString &&s)
CMyString cs3 = std::move(cs1); // CMyString(CMyString &&s)
CMyString cs4; // CMyString(const char *pszSrc = NULL)
cs4 = std::move(cs1); // CMyString &operator =(CMyString &&s)
C语言的左值右值由赋值运算符(=)决定;
C++的左值、右值由表达式决定:表达式结束后依然存在的对象,右值表达式结束后就不存在的临时对象。
(对对象取地址,能取到地址的就是左值,不能取到地址的就是右值)
c++11支持std::move()把左值对象切换成右值对象。
C++11右值引用:
形如typeName&& object;声明对象的方式通常都是右值引用,除了&&做模板参和auto&&自动类型推导时
有可能是右值也有可能是左值。
右值引用也分const右值引用和非const右值引用:
非常量右值引用只能绑定到非常量右值;
常量右值引用可以绑定到非常量右值和常量右值;
左值引用:
非常量左值引用只能绑定到非常量左值;
常量左值引用可以绑定到所有类型的值,包括非常量左值、常量左值、非常量右值和常量右值。
class CMyString{public: // 构造函数 CMyString(const char *pszSrc = NULL) { cout << "CMyString(const char *pszSrc = NULL)" << endl; if (pszSrc == NULL) { m_pData = new char[1]; *m_pData = '\0'; } else { m_pData = new char[strlen(pszSrc) + 1]; strcpy(m_pData, pszSrc); } } // 拷贝构造函数 CMyString(const CMyString &s) { cout << "CMyString(const CMyString &s)" << endl; m_pData = new char[strlen(s.m_pData) + 1]; strcpy(m_pData, s.m_pData); } // move构造函数 ---- 实质上就是·窃取·临时对象,注意参数的形式 CMyString(CMyString &&s) { cout << "CMyString(CMyString &&s)" << endl; m_pData = s.m_pData; s.m_pData = NULL; } // 析构函数 ~CMyString() { cout << "~CMyString()" << endl; delete[] m_pData; m_pData = NULL; } // 拷贝赋值函数 CMyString &operator =(const CMyString &s) { cout << "CMyString &operator =(const CMyString &s)" << endl; if (this != &s) { delete[] m_pData; m_pData = new char[strlen(s.m_pData) + 1]; strcpy(m_pData, s.m_pData); } return *this; } // move赋值函数 CMyString &operator =(CMyString &&s) { cout << "CMyString &operator =(CMyString &&s)" << endl; if (this != &s) { delete[] m_pData; m_pData = s.m_pData; s.m_pData = NULL; } return *this; }private: char *m_pData;};CMyString cs1("1234"); // CMyString(const char *pszSrc = NULL)
CMyString cs2(std::move(cs1)); // CMyString(CMyString &&s)
CMyString cs3 = std::move(cs1); // CMyString(CMyString &&s)
CMyString cs4; // CMyString(const char *pszSrc = NULL)
cs4 = std::move(cs1); // CMyString &operator =(CMyString &&s)
阅读全文
0 0
- [C++]C++11右值引用
- C++/C++11中左值、左值引用、右值、右值引用的使用
- 【C++】C++11特性:右值引用与转发
- c++move语义与右值引用
- C++:右值引用与移动构造
- [C++]右值引用和转移语义
- C++primer学习笔记--右值引用
- 【C++】右值引用与模板
- C++11右值引用
- C++ 11右值引用
- c++11 右值引用
- C++ 11右值引用
- C++11 右值引用
- C++ 11右值引用
- C++ 11右值引用
- C++ 11右值引用
- C++11右值引用
- C++ 11右值引用
- 用javascript实现最大堆
- PCB设计布线中的3种特殊走线技巧
- C++ 类型A支持强制转换类型B的写法
- 门面模式以及DI注入、容器模式
- IMPDP ORA-39152 ORA-39083 ORA-00959
- C++11右值引用
- redis集群扩容
- leetcode344. Reverse String
- ecmall 支付成功订单状态没有改变解决办法
- QML TEXT元素
- Handler,Thread 和HandlerThread三者之间关系
- 各种语言HMAC SHA256实现
- 剑指offer_数组---旋转数组的最小数字
- Nginx服务器中的location配置详解