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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之拷贝构造与拷贝赋值相关的知识,希望对你有一定的参考价值。

  拷贝构造和拷贝赋值------一个有点难的问题

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

  何为浅拷贝,即之赋值指针的地址,不会赋值指针的目标,容易引发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;

  }

以上是关于C++之拷贝构造与拷贝赋值的主要内容,如果未能解决你的问题,请参考以下文章

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

C++中构造函数,拷贝构造函数和赋值函数的区别

C++类与对象(详解构造函数,析构函数,拷贝构造函数,赋值重载函数)

❥关于C++之详解派生类DMA[必须]定义析构复制构造和赋值&深度拷贝

c++ 拷贝构造函数与赋值运算符重载函数的区别是

[ C++ ] C++类与对象之 类中6个默认成员函数