1. 三个基本操作可以控制类的拷贝操作
• 拷贝构造函数
• 拷贝赋值运算符
• 析构函数。
新标准还有2个函数:
• 移动构造函数(move constructor)
• 移动赋值运算符(move-assignment operator)
2. 二个法则
原则1:
通常这前3个函数作为一个整体出现。当决定一个类是否要自定义拷贝控制成员时,一个基本原则就是首先确定这个类是否需要一个析构函数,如果一个类需要析构函数,几乎可以肯定它也需要一个拷贝构造函数和一个拷贝赋值运算符。
class HasPtr{
public:
HasPtr(const std::string &s = std::string()):ps,(new std::string(s),i(0)){
}
~HasPtr(){
delete ps;}
}
如何使用编译器会合成默认的拷贝构造函数和拷贝赋值运算符,这些函数将简单的拷贝指针成员,这意味着多个 HasPtr 对象可能指向相同的内存(会带来问题的哦)
HasPtr f(HasPtr hp) //HasPtr是一个传值参数,所以被拷贝
{
HasPtr ret = hp; //拷贝给指定的HasPtr
return ret; //ret 和 hp 被销毁
}
原则2
需要拷贝操作的类也需要赋值操作,反之亦然,需要拷贝构造函数或者拷贝赋值函数不一定需要析构。