复制控制(copy control)

本文深入探讨了C++中的复制控制概念,包括复制构造函数、析构函数及赋值操作符的作用与实现细节。解释了为何复制构造函数的参数必须是引用而非值传递,并给出了具体的代码示例。

复制控制包括 :

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

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

撤销对象






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值