淺拷貝(複制位址):淺拷貝就是對記憶體位址的複制,讓目标對象指針和源對象指向同一片記憶體空間,當記憶體銷毀的時侯,指向這片記憶體的幾個指針需要重新定義才可以使用,要不然會成為野指針。
預設拷貝構造就是淺拷貝:
#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;
}
何時需要自定義深拷貝構造:
是否開啟新的記憶體位址
是否影響記憶體位址的引用計數