c 基礎概念之深淺拷貝

2021-08-11 06:48:37 字數 2920 閱讀 2855

**舉例:

#include

using

namespace

std;

class myclass

//拷貝建構函式

myclass(const myclass& c)

//一般函式

void show ()

拷貝建構函式是一種特殊的建構函式,函式的名稱必須和類名稱一致,它必須的乙個引數是本型別的乙個引用變數。**舉例:
#include

using

namespace

std;

class array

array(const array &temp) //盡可能的使用 const

void print()

private:

int count;

};int main(void)

執行結果:

array(const array &temp) //盡可能的使用 const

void print()

void printaddr()

~array()

private:

int count;

int *p ;

};int main(void)

執行截圖:

可以很明顯的看到圖中的報錯「double free」。說明我們將一塊記憶體 free了兩次。產生了錯亂!那麼是什麼原因引起的吶?

沒錯就是我們的拷貝建構函式,當我們寫為p = temp.p; 就是將乙個物件的p指標指向了傳進來的temp.p的位址。那麼他們兩個物件的指標就指向了同一塊記憶體,之後在析構函式中被free時,就會產生double free 。那麼如何解決這個問題吶?

就是將傳進來的temp 的每一塊記憶體分別賦值給p,於是拷貝建構函式就成了這樣:

array(const array &temp)

執行結果:

沒錯,這就是我們的深拷貝啦~_~**舉例:

#include

using

namespace

std;

class coordinate

~coordinate()

int getx()

int gety()

private:

int x;

int y;

};class line

void print()

~line()

private:

coordinate *a; //物件成員指標

coordinate *b;

};int main(void)

執行截圖:

ps:不知道大家有木有注意到 sizeof 什麼什麼的那部分,在 64 位的機器中,乙個指標佔8個位元組,那麼請想上一想?為什麼sizeof(line1)輸出的是16吶?因為line物件中有兩個指標coordinate 呀。哈哈哈

void play() const

//常成員函式的定義

就等價於下面:

void play(const myclass *this)

顯然給乙個 const指標指向的資料成員賦值自然是錯誤的。還有:
void play() const;

void play() ;

兩個函式互為過載,但是這個只能說可以這樣用,但絕對不會有人這樣使用!!!!**舉例:
int main(void)

ps:一般使用初始化列表就三種情況,
1.const成員的初始化

2.有參構造的物件成員

3.引用成員的初始化

const coordinate  &my2 = my1;  //常引用

const coordinate *p = &my1; //常指標

說明:與常物件相同,只能使用常成員函式,不能使用其他型別的函式

**舉例:

#include

using

namespace

std;

class coordinate

~coordinate()

int getx() //與下面的是不同的函式,但一般不這樣書寫

int getx() const

//常成員函式,與上面的函式不衝突,但不建議這樣寫

int gety() const

void printinfo() const

//要求 this 指標唯讀

private:

int x;

int y;

};int main(void)

c 基礎概念之深淺拷貝

舉例 include using namespace std class myclass 拷貝建構函式 myclass const myclass c 一般函式 void show 拷貝建構函式是一種特殊的建構函式,函式的名稱必須和類名稱一致,它必須的乙個引數是本型別的乙個引用變數。舉例 inclu...

python基礎之深淺拷貝

深淺拷貝 對於字串 str 數字 int 布林型別 bool 等型別深淺拷貝都是開闢新記憶體 對於列表 list 集合 set 字典 dict 深淺拷貝可變型別都一樣,如 1,2,3 對於列表 list 集合 set 字典 dict 存在巢狀的深淺拷貝不一樣,如 1,2,3,4,5,6 淺拷貝只拷貝...

python基礎高階之深淺拷貝

深拷貝與淺拷貝的區別 淺複製shadow copy 1,只拷貝物件自身,僅僅是指向被複製的記憶體位址 2,內層列表的引用沒有拷貝,即淺拷貝拷貝的是第一層引用 3,如果原位址中物件被改變了,那麼淺複製出來的物件也會相應改變。深複製deep copy 1,開闢了一塊新的記憶體位址用於存放複製的物件 2,...