C++簡明圖解分析淺拷貝與深拷貝
類中有指針成員 才會討論 淺拷貝 和深拷貝問題。
淺拷貝(單純值拷貝)

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
char *m_name;
public:
Person(char *name)
{
cout<<"有參構(gòu)造"<<endl;
m_name = (char *)calloc(1,strlen(name)+1);
if(m_name == NULL)
{
cout<<"空間申請失敗"<<endl;
exit(-1);
}
strcpy(m_name, name);
}
~Person()
{
cout<<"析構(gòu)函數(shù)"<<endl;
//釋放指針成員 指向的堆區(qū)空間
if(m_name != NULL)
{
free(m_name);
m_name = NULL;
}
cout<<"-----001------"<<endl;
}
};
int main(int argc, char *argv[])
{
Person ob1("lucy");
Person ob2 = ob1;//拷貝構(gòu)造(默認(rèn)是淺拷貝)
cout<<"ob2.m_name = "<<ob2.m_name<<endl;
return 0;
}
深拷貝
必須在拷貝構(gòu)造中給ob2.m_name申請空間

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
char *m_name;
public:
Person(char *name)
{
cout<<"有參構(gòu)造"<<endl;
m_name = (char *)calloc(1,strlen(name)+1);
if(m_name == NULL)
{
cout<<"空間申請失敗"<<endl;
exit(-1);
}
strcpy(m_name, name);
}
Person(const Person &ob)
{
cout<<"拷貝構(gòu)造函數(shù)(深拷貝)"<<endl;
m_name = (char *)calloc(1, strlen(ob.m_name)+1);
if(m_name == NULL)
{
cout<<"空間申請失敗"<<endl;
exit(-1);
}
strcpy(m_name, ob.m_name);
}
~Person()
{
cout<<"析構(gòu)函數(shù)"<<endl;
//釋放指針成員 指向的堆區(qū)空間
if(m_name != NULL)
{
free(m_name);
m_name = NULL;
}
}
};
int main(int argc, char *argv[])
{
Person ob1("lucy");
Person ob2 = ob1;//拷貝構(gòu)造
cout<<"ob2.m_name = "<<ob2.m_name<<endl;
return 0;
}
總結(jié)
1、如果類中的成員 指向了堆區(qū)空間 一定要記得在析構(gòu)函數(shù)中 釋放該空間
2、如果用戶 不實現(xiàn) 拷貝構(gòu)造 系統(tǒng)就會提供默認(rèn)拷貝構(gòu)造,而默認(rèn)拷貝構(gòu)造 只是單純的賦值 容易造成淺拷貝問題
3、用戶記得 要實現(xiàn):無參構(gòu)造(初始化數(shù)據(jù))、有參構(gòu)造(賦參數(shù))、拷貝構(gòu)造(深拷貝) 、析構(gòu)函數(shù)(釋放空間)
拷貝構(gòu)造函數(shù)的調(diào)用時機
拷貝構(gòu)造函數(shù)調(diào)用的時機:舊對象 給新對象 初始化
class Data
{
public:
Data()
{
cout<<"無參構(gòu)造"<<endl;
}
Data(const Data &ob)
{
cout<<"拷貝構(gòu)造"<<endl;
}
~Data()
{
cout<<"析夠函數(shù)"<<endl;
}
};情形1:舊對象給新對象初始化
Data ob1; Data ob2 = ob1;//調(diào)用拷貝構(gòu)造
情形2:普通對象作為函數(shù)的參數(shù)
void fun01(Data ob)//Data ob=ob1 發(fā)生拷貝構(gòu)造
{
}
int main(int argc, char *argv[])
{
Data ob1;
fun01(ob1);
return 0;
}情形3:普通對象 作為函數(shù)的返回值
#include <iostream>
using namespace std;
Data fun01(void)
{
Data ob1;
return ob1;
}
int main(int argc, char *argv[])
{
Data ob = fun01();
return 0;
}vs下會發(fā)生拷貝構(gòu)造:

Qt、linux不會發(fā)生拷貝:


到此這篇關(guān)于C++簡明圖解分析淺拷貝與深拷貝的文章就介紹到這了,更多相關(guān)C++淺拷貝與深拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言的getc()函數(shù)和gets()函數(shù)的使用對比
這篇文章主要介紹了C語言的getc()函數(shù)和gets()函數(shù)的使用對比,從數(shù)據(jù)流中一個是讀取字符一個是讀取字符串,需要的朋友可以參考下2015-08-08

