C 深拷貝與淺拷貝(實現String類)

2021-10-06 15:33:57 字數 3466 閱讀 7973

所謂淺拷貝,指的是在物件複製時,只是對物件中的資料成員進行簡單的複製,預設拷貝建構函式執行的也是淺拷貝。簡單的說,淺拷貝就是值傳遞,將源空間裡面的內容複製到目標空間中。

存在缺陷:多個指標可能共用管理一塊記憶體空間,在釋放時,導致對一塊空間的多次釋放,造成記憶體洩露。

在「深拷貝」的情況下,對於物件中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間。

用深動形象的語言來說,如果把拷貝看作下面這幅圖,那麼,淺拷貝只能拷走美人魚的頭,水下部分它將無法操作,而深拷貝 不僅可以拷走頭,還可以操作水下隱含的部分。

好了,說到這裡,咱們可能對深淺拷貝或多或少的有了一些認識,那麼,下面,我們將實現乙個string 類,來更加具體權威的解釋深淺建構函式。

#includeusing namespace std;

class string

else

}string(const string& s)//拷貝建構函式

:_pstr(s._pstr)

string& operator=(const string& s)//賦值運算子過載

return *this;

}~string ()//析構函式

}private:

char* _pstr;

};void funtest()

int main ()

該例證明了淺拷貝會存在多個物件共用同一塊空間,在呼叫析構函式銷毀空間時,會出現對一塊空間多次釋放的情況,導致記憶體崩潰

#includeusing namespace std;

class string

else

}//拷貝建構函式********************************************

string(const string& s)

:_pstr(null)//選擇最佳

//賦值 運算子過載******************************************

//方式一:

string& operator=(const string& s)

return *this;

}//方式二:

//string& operator=(const string& s)

//

//方式三:

//string& operator=( string s)

////三種賦值運算子過載解決方案, 第一種方式為最優方案

//析構函式*****************************************

~string ()

}private:

char* _pstr;

int _count;

};void funtest()

int main ()

a.什麼是引用計數?

在開闢空間時,為了記錄該空間有多少物件在共用它,也就是說有多少指標指向它,採用再開闢乙個空間的方式,記錄該空間被指向的次數,這種方式被稱為引用計數。

b.用引用計數實現string時,引用計數可以普通的成員變數?為什麼?

解析:引用計數不可以為普通的成員變數,因為一旦出了作用域,該空間被銷毀,達不到想要的效果

c.用引用計數實現string時,引用計數可以類的靜態成員變數嗎? 為什麼?

解析:類的靜態成員變數,但在需要另外開闢空間時,採用這種方式就

#includeusing namespace std;

class string

else

_count=1;

}string (const string& s)

:_pstr(s._pstr)

~string ()

}private:

char* _pstr;

static int _count;

};int string:: _count=0;

void funtest()

int main()

為了在釋放的時候,防止忘記釋放引用計數所開闢的空間,所以盡量採用new [ ]

的方式來開闢空間,與delete[ ]搭配使用。

//************引用計數*******************************

#includeusing namespace std;

class string

else

}string (const string& s)

:_pstr(s._pstr)

,_pcount(s._pcount)

string& operator=(const string& s)

_pstr =s._pstr;

_pcount=s._pcount;

++_pcount;

}return *this;

}~string ()

}private:

char* _pstr;

int* _pcount;

};void funtest()

int main()

(cow不是奶牛)

//****寫時拷貝:如果要朝當前物件寫東西,最好使用這種方式*********

//單執行緒不會有問題

#includeusing namespace std;

class string

else

getraf()=1;

}string (const string& s)

:_pstr(s._pstr)

string& operator=(const string& s)

return *this;

}~string ()

char& operator (size_t index)

return _pstr[index];

}const char& operator (size_t index)const

private:

int& getraf()

void release()

}private:

char* _pstr;

};void funtest()

int main()

下面,在這裡提出兩點關於string類來說非常重要點:

一.熟悉庫中string類的每個介面,查文件,熟悉庫中的string類。

二.調研vs和linux系統下string類的結構,他們是否採用用深拷貝原理實現。

實現淺拷貝與深拷貝

js包含基本資料型別與引用資料型別兩種不同的資料型別的值,深拷貝與淺拷貝的概念只存在於引用資料型別。對於引用型別,淺拷貝是拷貝了指向這個物件堆記憶體的指標,是拷貝了對原物件引用,深拷貝是拷貝了該物件的所有屬性到乙個新的物件,若是原物件的某屬性依然引用了其他物件,那麼需要將原物件引用的其他物件一併進行...

C 深拷貝 與 淺拷貝

最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...

C 淺拷貝與深拷貝

淺拷貝 shallow copy 指的是當物件的字段被拷貝的時候,字段應用的物件不會被拷貝。深拷貝是對物件例項當中的字段引用的物件也進行拷貝的一種方式。淺拷貝可以通過將類實現介面icloneable class myclass icloneable 舉個簡單的例項 using system usin...