复制控制包括 :
复制构造函数( copy constructor)
析构函数(destructor)
赋值操作符(assignment operator)
复制构造函数
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数
对 vector<string> vec(5);
编译器首先使用string默认构造函数创建一个临时值来初始化vec,然后使用复制构造函数将临时值复制到vec的每个元素
为什么复制构造函数的形参不限制为const,而必须是引用 &?
答:因为不使用引用,而使用传值的方式的时候,传值给复制构造函数会导致调用复制构造函数...
所以会导致复制构造函数的无穷调用,所以复制构造函数的形参必须是引用
为了防止类的复制,(如iostream类就不允许复制) 类必须显式声明其复制构造函数为private
大多数类应定义复制构造函数和默认构造函数,最后不要让系统生成 合成构造函数和合成复制构造函数
class Foo
{
public:
//默认构造函数
Foo():pstring(new string ),i(0),d(0){}
//复制构造函数
Foo(const Foo& other)
{
pstring = new string;
*pstring = *(other.pstring);
i=other.i;
d=other.d;
}
//赋值运算符
Foo& operator = (const Foo &f)
{
pstring = f.pstring;
i=f.i;
d=f.d;
return *this;
}
private:
string *pstring;
int i;
double d;
};
析构函数
其用途之一是自动获取资源,它可以完成所需的资源回收,用来当对象超出作用域或需要删除对象的时候删除对象
当然析构函数可以执行任意操作,析构函数是设计者希望
在该类对象使用完毕之后执行的
撤销类对象的时候会自动调用析构函数
只有删除指向动态分配对象的指针或实际对象(而不是对象的引用),超出作用域时,才会运行析构函数。
动态分配的对象只有在指向该对象的指针被删除时才撤销
如:p= new FOO;
...
delete p;
三法则:如果类需要析构函数,则它也需要赋值操作符和复制构造函数
编译器总会为我们合成一个析构函数,它按对象创建时的逆序撤销每个非static成员,它按成员在类中声明
次序的逆序撤销成员。合成析构函数不删除指针成员所指向的对象。合成析构函数调用该成员的析构函数来
撤销对象