1,關於賦值的疑問:
1,什麼時候需要過載賦值操作符?
2,編譯器是否提供預設的賦值操作符?
2,關於賦值的疑問:
1,編譯器為每個類預設過載了賦值操作符;
1,意味著同型別的類物件可以相互賦值;
2,預設的賦值操作符僅完成淺拷貝;
3,當需要進行深拷貝時必須過載賦值操作符;
1,和拷貝建構函式相同;
4,賦值操作符與拷貝建構函式有相同的存在意義;
3,預設賦值操作符過載程式設計實驗:
1,main.cpp 檔案:
1 #include 2 #include 342,輸出結果:using
namespace
std;56
class
test
714 test(int
i)15
18 test(const test&obj)
1922 test& operator = (const test&obj)
2329
30return *this;31
}32void
print()
3336 ~test()
3740
};41
42int
main()
43
m_pointer = 0x9387008
m_pointer = 0x9387018
3,賦值操作符過載注意事項:
1,賦值操作符返回值一定是引用,為了連續賦值;
2,引數型別一定是 const type&;
3,不能自賦值;
4,返回當前物件;
4,關於賦值的疑問:
1,如果要進行深拷貝,拷貝建構函式和賦值操作符的實現都要自定義;
5,一般性原則:
1,過載賦值操作符,必然要實現深拷貝;
1,實現深拷貝和自定義賦值操作符及拷貝建構函式是充要條件;
6,陣列類的優化程式設計實驗:
1,intarray.h 檔案:
12,首先寫出賦值操作符注意事項模板:#ifndef _intarray_h_
2#define _intarray_h_34
class
intarray
5;
1 intarray& intarray::operator = (cosnt intarray&obj)273,函式實現:8return *this
;9 }
1 intarray& intarray::operator = (const intarray&obj)2144,main.cpp 檔案:15/*
深拷貝
*/16 m_length =obj.m_length;
17delete
m_pointer;
18 m_pointer =pointer;19}
20}2122
return *this
;23 }
1 #include 2 #include5,輸出結果:3 #include "
intarray.h"4
5using
namespace
std;67
intmain()825
26delete
a;27
delete
b;28
29return0;
30 }
1 array.length() = 5
2 brray.length() = 10
3 array.length() = 10
4 brray.length() = 10
6,使用二階構造後,拷貝建構函式是私有的,拷貝建構函式就沒有作用了,不允許拷貝構造,但是應該過載賦值操作符過載;
7,編譯器預設提供函式:
1,雖然類中什麼都沒寫,但是編譯器會放四個函式實現進去;
8,下面的**輸出什麼?為什麼?
1,**示例:
19,字串問題 1 程式設計實驗:string s = "
12345";
2const
char* p = s.c_str(); //
返回字元指標,代表 c 語言中的字串;
34 cout << p <
5abced");
78 cout << p << endl;
1,main.cpp 檔案:
1 #include 2 #include 342,這段**混合了 c 和 c++ 的方式,出了意想不到的錯誤;using
namespace
std;56
intmain()
7
10,關於 string 的疑問 1:
1,string 物件內部維護了乙個指向資料的 char* 指標,這個指標可能在程式 執行的過程中發生改變,我們盡量不要操作這個指標;
3,學習 c++,並且用的是標準庫中的內容,所以現在採用的程式設計思想就應該是 c++ 程式設計思想,不要混合使用 c 和 c++ 思想;
11,下面的程式輸出什麼?為什麼?
1,**示例:
12,沒有輸出;const
char* p = "
12345
"; //
p 可以用字串物件代替;
2string s = ""; //
混合了,該注意了;
34 s.reserve(10);5
6//不要使用 c 語言中的方式操作 c++ 中的字串
7for(int i=0; i<5; i++)811
12if( !s.empty() )
13
12,字串問題 2 程式設計實驗:
1,main.cpp 檔案:
1 #include 2 #include 342,更改程式為:using
namespace
std;56
intmain()718
19if( !s.empty() ) //
列印不出;
2023
24 cout << s << endl; //
列印不出;
2526
for(int i=0; i<5; i++) //
可以列印;
2730
31return0;
32 }
1 #include 2 #include 343,c++ 工程中,盡量避免指標使用,字串類出現就是為了替代字元指標;using
namespace
std;56
intmain()
7
13,關於 string 的疑問 2:
14,小結:
1,在需要進行深拷貝的時候必須過載賦值操作符;
1,也要重新定義拷貝建構函式;
2,賦值操作符和拷貝建構函式有同等重要的意義;
3,string 類通過乙個資料空間儲存字串資料;
4,string 類通過乙個成員變數儲存當前字串的長度;
5,c++ 開發時盡量避開 c 語言中慣用的程式設計思想;
1,字串類得到的是字串物件,直接用成員函式操作這個物件就可以,不需要用 c 語言中的 for 迴圈之類的;
C 中的拷貝建構函式和賦值操作符過載
在c 中,當乙個類為 空 時,裡面真的為空嗎?不是的,裡面有四個函式。分別是建構函式,析構函式,拷貝建構函式,過載賦值操作符。class test 等價於class test 拷貝建構函式和過載賦值操作符有什麼區別?test t1 test t2 t1 等價於test t2 t1,此時呼叫拷貝建構函...
拷貝建構函式和賦值操作符
類有預設的建構函式 拷貝建構函式 析構函式 賦值操作運算子 和取位址運算子 預設的賦值操作運算子和預設的拷貝建構函式類似,對於每個非static成員,都是執行逐個成員賦值 memberwise assignment 同時也是按位賦值 bitwise copy 即,只是簡單地將每個類成員的記憶體中的直...
賦值操作符和拷貝建構函式
最近開發乙個專案,用到了單例模式,標頭檔案大概如下 class crecguard crecguard private void guard void unguard private critical section cs template class csingleton 禁止建構函式 csing...