拷贝构造函数重载相信我们已经见过太多,无非就是这样的形式(构造函数多了个常量引用作为参数):
Foo& Foo::Foo(const Foo &f);
但是C++11带来了移动语义,我们可以定义移动构造函数,构造函数接收一个右值引用的时候,就会调用它。示例如下:
Foo& Foo::Foo(Foo &&f); // 这里通常去掉const,因为移动语义通常意味着要“偷”资源。
int main()
{
Foo f1{...}; // 省略掉了初始化
Foo f2(f1); // 这里调用拷贝构造函数
Foo f3(std::move(f1)); // 这里将调用移动构造函数,因为std::move返回了f1的右值引用,f1成为将亡值
// 将亡值f1被释放或被重新分配资源
// ...
// ...
return 0;
}
思路基本和拷贝构造/移动构造函数之间的关系差不多,下面是函数声明:
Foo& operator=(const Foo& f); // 这里返回reference to this,性能比返回拷贝要好些
Foo& operator=(Foo &&f); // 里面要进行“偷”资源的操作,并且一定要传入右值引用才能启用
对于前置的一元运算符@A:
Foo& Foo::operator@();
对于后置的一元运算符A@
Foo& Foo::operator@(int);
对于二元运算符,比如A0=A1@A2的情况
Foo& Foo::operator@(const &A);
待补充…
原文:https://www.cnblogs.com/jo3yzhu/p/12386087.html