小記:靜默如初,安之若素
1. 淺拷貝和深拷貝
1)定義:如果乙個類中包含指標形式的成員變數,用預設的拷貝建構函式只是複製指標變數本身,而沒有複製指標所指向的內容,這種拷貝方式成為淺拷貝。
2)淺拷貝將會導致不同物件間的資料共享,同時會在析構函式中引發」double free「異常,因此就必須自己定義乙個支援複製指標內容的拷貝建構函式,即深拷貝.
2
using
namespace std;34
class
integer512
~integer
(void)13
17//integer i2(i1)
18 = i1.m_data
19//預設的拷貝建構函式(淺拷貝)
20/*integer(const integer& that)
21 */
2425
//integer i2(i1);
26 = new int(*i1.m_data);
27//自定義深拷貝構造
28integer
(const integer &that)
2932
33void
print
(void
)const
3437
38private:39
int*m_data;
//指標一定要注意最後釋放,否則造成記憶體洩露40}
;4142int
main
(int argc,
char
*ar**)
43
筆試題/練習:實現string類
1 #include
2 #include
3using
namespace std;
4class
string513
//析構函式14~
string
(void)15
18//拷貝建構函式
19//淺拷貝
20//string (const string &that)
21//
2425
//深拷貝
26 string (
const string &that)
2731
private:32
char
*m_str;
33public:34
const
char
*c_str()
const
3538};
39int
main
(int argc,
char
* ar**)
40
1)當編譯器看到兩個物件的賦值操作時,比如」 i3=i2 「,會將其翻譯成函式呼叫形式: 」i3.operator = (i2)「,該函式成為拷貝賦值操作符函式,由該函式完成兩個物件的複製的過程。
2)預設的拷貝賦值函式和預設拷貝建構函式型別,也是淺拷貝,有**」double free「問題和記憶體洩露**問題;
3)所以必須自己定義支援深拷貝的拷貝賦值操作符函式;
4)語法:
類名 &
operator=(
const 類名& that)
return
*this
;//返回自引用
}
#include
2using
namespace std;34
class
integer512
~integer
(void)13
17//integer i2(i1)
18 = i1.m_data
19//預設的拷貝建構函式(淺拷貝)
20/*integer(const integer& that)
21 */
2425
//integer i2(i1);
26 = new int(*i1.m_data);
27//自定義深拷貝構造
28integer
(const integer &that)
2932
33void
print
(void
)const
3437
38//i3 = i2;-->i3.operator=(i2)
39 = i2.m_data
40//類中預設的拷貝賦值函式
41/*integer& operator=(const integer& that)
42 */
47//i3 = i2;==>i3.operator=(i2)
48//*i3.m_data = *i2.m_data;
49//自定義深拷貝賦值函式
50 integer&
operator=(
const integer &that)
5158
return
*this;59
}60private:61
int*m_data;
//指標一定要注意最後釋放,否則造成記憶體洩露62}
;6364int
main
(int argc,
char
*ar**)
65
筆試題/練習:實現string類
示例程式(拷貝構造和拷貝賦值):
1 #include
2 #include
3using
namespace std;
4class
string513
//析構函式14~
string
(void)15
18//拷貝建構函式
19//淺拷貝
20//string (const string &that)
21//
2425
//深拷貝
26 string (
const string &that)
2731
//拷貝賦值
32//自定義深拷貝賦值操作函式
33//s2==>hello
34//s3==>hello world
35//s2 = s3; ==>s2.operator(s3)
36 string&
operator=(
const string &that)
3744
return
*this
;//返回自引用45}
46private:47
char
*m_str;
48public:49
const
char
*c_str()
const
5053};
54int
main
(int argc,
char
* ar**)
55
C 拷貝建構函式 淺拷貝和深拷貝
建構函式可以沒有,也可以有多個。複製建構函式只有乙個,不定義編譯器自動生成,使用者寫就使用自定義的複製建構函式 物件之間的複製語句不會呼叫複製建構函式。利用編譯器提供的拷貝建構函式,會做淺拷貝 淺拷貝帶來的問題就死堆區記憶體的重複釋放 案例1 class student student 程式正常輸出...
拷貝構造和拷貝賦值
注意指標型別成員變數的深拷貝問題 拷貝構造屬於定義,並賦值 拷貝賦值屬於已經定義,只是賦值。拷貝構造的深拷貝,因為如果提供了拷貝建構函式,則構造該物件時使用的是拷貝建構函式。在拷貝建構函式中只需要 分配新資源,拷貝新內容,返回自引用即可。但是在拷貝賦值函式中,如果存在指標成員變數一般在物件定義時已經...
C 預設拷貝建構函式 深度拷貝和淺拷貝
c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有定義拷貝建構函式時,編譯器會預設提供乙個拷貝建構函式,進行成員變數之間的拷貝。這個拷貝操作是淺拷貝 這裡只講拷貝建構...