C++之拷贝构造与拷贝赋值

本文详细探讨了C++中的拷贝构造函数和拷贝赋值操作符,阐述了它们在对象复制过程中的作用,以及深拷贝与浅拷贝的区别。通过对经典例子的分析,解释了何时需要自定义拷贝构造和拷贝赋值,并讨论了拷贝语义在防止资源重复和管理复杂对象所有权中的重要性。
摘要由CSDN通过智能技术生成
拷贝构造和拷贝赋值------一个有点难的问题

  介绍之前,我们需要首先了解深拷贝与浅拷贝的差异:  何为深拷贝,深拷贝不会复制指针,而是令目标对象拥有独立的资源,该资源是从元对象中复制,即先找到对象的指针,在通过指针拷贝其内容;

  何为浅拷贝,即之赋值指针的地址,不会赋值指针的目标,容易引发double free异常,即多个目标指向同一个内存;

  缺省拷贝构造函数和缺省拷贝赋值函数

  如果一个类没有显示的定义一个拷贝构造函数和拷贝赋值运算符,则编译器会为其默认提供一个,但是这个函数只能进行浅拷贝;

如果一个类拥有指针的成员变量,并用指针维护动态分配的内存资源,哪么就该为该类定义支持深拷贝的拷贝构造函数和拷贝赋值运算符函数。

哪么接下来问题就来了,怎么实现呢?

  拷贝构造:T::T(T const& that){} 分配资源,复制内容

  拷贝赋值:T& operator=(T const& r){} 防止自赋值、分配新资源、释放旧资源、复制新内容、返回自引用;

  为了防止误用,我们也可以将两者私有化,防止误用
#include<iostream>

  using namespace std;

  class Integer{

  public:

    Integer(int num):i(new int(num)){}

    Integer(Integer& const that):i(new int(*that.i)){}

    Integer& operatot=(Integer const& r){

      *i=*r.i;

      return *i;

    }

    ~Integer(){

    delete i;

  }

  void const& getValue()const{

    cout<<*i<<endl;

  }

 

  private:

    int* i;

    //Integer(const Integer& that);

    //Integer& operator(Integer const& r);

  };

  int main(){

    Integer i1(10),i2=i1;

    i1.getValue();

    i2.getValue();  

    return 0;

  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值