一、拷贝控制操作
1、拷贝构造函数:一个构造函数的一个参数是自身类类型的引用,且额外参数都有默认值
class Foo{ public: Foo(const Foo&); //拷贝构造函数;必须引用类型;最好是const类型;不应该是explicit的 }
2、拷贝赋值运算符
Foo& operator = (const Foo&);
3、移动构造函数
4、移动赋值运算符
5、析构函数:释放对象使用的资源,并销毁对象的非static数据成员
~Foo();
6、三/五法则
7、在函数的参数列表后加上=delete指出该函数为删除的
二、拷贝控制和资源管理
1、通常管理类外资源的类必须定义拷贝控制成员;这种类需要通过析构函数来释放对象所分配的资源
2、当编写一个复制运算符时,一个好的模式是先将右侧运算对象拷贝到一个局部临时对象中。当拷贝完成后销毁左侧运算对象的现有成员就是安全的:防止自己赋值给自己
HasPtr& HasPtr::operator=(const HasPtr &rhs) { auto newp = new string(*rhs.ps); delete ps; ps = newp; i = rhs.i; return *this; }
三、对象移动
1、标准库容器、string和shared_ptr类既支持移动也支持拷贝。IO类和unique_ptr类可以移动但不能拷贝
2、右值引用:必须绑定到右值的引用;通过&&来获得右值引用
int &&rr3 = std::move(rr1);
3、移动构造函数和移动赋值运算符
StrVec::StrVec(StrVec &&s) noexcept //第一个参数为类类型的引用;其他参数都必须有默认参数 :elements(s.elements), first_free(s.first_free) //使用noexcept来提示编译器不抛出异常 { s.elements = s.first_free = nullptr; //确保移后源对象主语销毁无害的状态 }
4、右值引用和成员函数
void push_back(const &X); void push_back(&&X);
5、在参数列表后面可以放置一个引用限定符
原文:http://www.cnblogs.com/dylqt/p/4880926.html