拷贝版本(成员)函数与移动版本(成员)函数
来源:互联网 发布:linux mint 中文 编辑:程序博客网 时间:2024/05/17 00:58
拷贝版本(成员)函数与移动版本(成员)函数
通常,移动版本(成员)函数接受一个指向非const的右值引用,拷贝版本(成员)函数接受一个指向const的左值引用。
一般来说,我们不需要为(成员)函数定义接受一个const X&&参数或是一个普通的X&参数的版本:
当我们希望从实际参数“窃取”数据时,通常传递一个右值引用,为了达到这一目的,实参不能是const的。
类似的,从一个对象进行拷贝的操作不应该改变该对象,因此不需要定义一个接受一个普通的X&参数的版本。
具体代码见下一章。
引用限定符(reference qualifier)
在C++旧标准中,右值的使用方式可能会令我们惊讶:
string string1 = "a value";string string2 = "another";string1 + string2 = "wow"; //对一个string右值进行赋值
此处我们居然对一个右值进行了赋值!
C++11新标准希望在我们自己的类中避免这种使用方式(但为了维持向后兼容,新标准的标准库类仍然允许这种行为)。具体方法是:在参数列表后放置一个引用限定符。
引用限定符可以是&和&&,分别之处this可以指向一个左值或右值。
对于&限定的函数,我们只能将它用于左值。
对于&&限定的函数,我们只能将它用于右值。
class Foo{public: Foo() = default; Foo(int m, float n):a(m), b(n) { } Foo &operator=(const Foo &object) & //只能用于左值 { a = object.a; b = object.b; return *this; } void print() & //只能用于左值 { cout << "just for test..." << endl; } int a; float b;};Foo& retFoo(){ cout << "retFoo" << endl; Foo t(1,1.2); return t;}Foo retVal(){ cout << "retVal" << endl; Foo t(1,1.2); return t;}int main(){ Foo i, j; i = j; retFoo() = j; i = retVal(); i.print(); retVal().print(); //error}
阅读全文
0 0
- 拷贝版本(成员)函数与移动版本(成员)函数
- 重载成员函数的常成员函数版本
- C++类的特殊成员-默认/拷贝/移动构造函数
- 成员变量与成员函数
- 常量对象、常量成员函数、常量成员函数的非常量重载版本。
- 内联成员函数与重载成员函数
- const成员函数与static成员函数
- 拷贝构造函数和const成员函数
- 模板类成员函数的特化版本选择
- 成员函数与内存空间
- 构造函数 与成员函数
- 内联函数 与 成员函数
- 成员函数与函数指针
- 成员函数与静态函数
- 静态成员与静态成员函数
- 静态成员函数与静态数据成员
- 静态成员函数 与 静态数据成员
- 静态成员函数与静态数据成员
- Google 投资 Lyft 背后、AlphaGo Zero 人工智能威胁论?
- 16进制转换方法 Java
- 移动构造函数和移动赋值运算符
- [CodeForces
- C语言提高-第26/27讲: 实现线性表基本操作的函数/编写查找和排序函数
- 拷贝版本(成员)函数与移动版本(成员)函数
- 数据结构与算法分析—栈的数组实现(C语言)
- 小朋友学C语言(11):求1到100的和
- TensorFlow练习5: 训练一个简单的游戏AI(Deep Q Network)
- 经典递归解决汉诺塔!
- php 正则表达式总结及应用
- c++/c的内存管理机制
- UVa11552
- LeetCode 202.Happy Number 利用存储结构或快慢指针