复制控制(copy control)

复制控制包括 :

复制构造函数( 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成员,它按成员在类中声明

次序的逆序撤销成员。合成析构函数不删除指针成员所指向的对象。合成析构函数调用该成员的析构函数来

撤销对象






你可能感兴趣的:(复制控制(copy control))