天天看點

009--c++養成之路(淺拷貝與深拷貝)

淺拷貝(複制位址):淺拷貝就是對記憶體位址的複制,讓目标對象指針和源對象指向同一片記憶體空間,當記憶體銷毀的時侯,指向這片記憶體的幾個指針需要重新定義才可以使用,要不然會成為野指針。
預設拷貝構造就是淺拷貝:
#include<iostream>
using namespace std;
class Complex{
  double m_real;
  double m_vir;
public:
  Complex(double real){
    m_real = real;
    m_vir = 0;
  }
  /*Complex(Complex const& that){//拷貝構造函數---淺拷貝
    m_real = that.m_real;//拷貝對象就是拷貝對象裡的成員變量
    m_vir = that.m_vir;
  }*/     //這裡如果不寫,編譯器就自動提供預設拷貝構造函數
  void print(){
    cout << m_real << "+" << m_vir << "i" << endl;
  }
};
int main(){
  Complex c1 = 1.4;//隐式調用拷貝構造函數
  c1.print();
  //Complex c2 = c1;//隐式調用拷貝構造函數
  Complex c2(c1);//顯示調用拷貝構造函數
  c2.print();
  Complex* c3 = new Complex(c2);
  c3->print();
  getchar();
  return 0;

}
深拷貝(複制記憶體):深拷貝就是指拷貝對象的具體内容,而記憶體位址是自主配置設定的,拷貝結束後,倆個對象雖然存的值是相同的,但是記憶體位址不一樣,兩個對象也互不影響,互不幹涉。      
#include<iostream>
using namespace std;
class Complex{
  double* m_real;
  double* m_vir;
public:
  Complex():m_real(new double(1.4)),m_vir(new double(2.1)){

  }
  Complex(Complex const& that){//深拷貝函數
    m_real = new double;//先配置設定記憶體
    m_vir = new double;
    *m_real = *that.m_real;//再拷貝内容
    *m_vir = *that.m_vir;
  }
  void print(){
    cout << *m_real << "+" << *m_vir << "i" << endl;
  }
};
int main(){
  Complex* c1=new Complex();
  c1->print();
  Complex* c2 = new Complex(*c1);
  c2->print();
  delete c1;
  delete c2;
  getchar();
  return 0;

}
何時需要自定義深拷貝構造:
是否開啟新的記憶體位址
是否影響記憶體位址的引用計數      

繼續閱讀