賦值語句其實是對「=」進行過載。
test& operator=(const test &t)
賦值語句的寫法必須是上述形式嗎,答案是否定的。
1.為什麼傳參方式是傳引用?test(test &t)
test t1(10);
test t2;
下式進行改寫
t2 = t1;
如果採用傳值方式,用t1初始化形參時,會呼叫拷貝建構函式,效率降低。傳引用的好處是,不調動拷貝建構函式,時間、記憶體空間都節約
2.為什麼引數前要加const?test(const test &t)
傳引用的方式,加const代表常引用,防止更改資訊,如例子中,不加const,我可以更改t1的data值
test& operator=(test &t)
這就會導致更改外部的資料,答案也會使人莫名其妙,很明顯我t1.data=10,給t2賦值之後,t2.data也應該是10啊。
3.為什麼返回值是型別的引用?test& operator=(const test &t)
(1)先解釋為什麼返回的是型別,而不是空型別(void)
//如果**中出現連等
t3 =t2 = t1;
根據等號自右向左結合,在t2 = t1之後,如果返回值為空,將無法給t3賦值。當然如果你能保證不會出現任何連等的情況,可以返回void,也不需要看下面的一點了。
(2)為什麼要返回型別的引用
顯而易見,如果單純返回型別,會呼叫構造拷貝函式,造成空間時間上的浪費。
(3)返回引用永遠不會出問題嗎?
舉個例子
test& fun(test t)
int main()
那麼到底什麼時候才能返回引用?
如果要返回的空間在該函式結束後空間被釋放,那麼不可採用引用;反之,則可。
4.為什麼要檢查引數
if(this != &t)
data = t.data;
return *this;
...
// test& operator=(test *const this, const test &t)//下式實際形式改寫
test& operator=(const test &t)
......
//實際形式改寫
//operator=(&t2, t1);
t2 = t1;
檢測是否自身給自身賦值,自身賦值是沒有意義的!
舉個例子,這樣一種情況
test t1(10);
test &t2 =t1;
test &t3 = t2;
t3 = t1; //自身賦值
1.賦值函式即等號的過載,「=」此時是函式,而不是單純的「=」;
2.賦值函式的寫法可以依據情況而定,引數是否採用引用,返回值是否採用引用等等,只要確定不出錯即可。
3.我認為漂亮的賦值函式的內部構造是:
檢測自賦值–>釋放原有的記憶體資源–>分配新的記憶體資源,並複製內容–>返回本物件的引用這些將會牽扯到呼叫優化,深拷貝,淺拷貝,隨後文章「函式的呼叫優化」「深拷貝和淺拷貝」會闡述
C 主題 轉換函式
出處 c 主題 轉換函式 轉換函式的基本規則 轉換函式只能是成員函式,無返回值,空引數。不能定義到void的轉換,也不允許轉換成陣列或者函式型別。轉換常定義為const形式,原因是它並不改變資料成員的值。轉換函式所引出的問題 轉換操作符過於強大,它可以定義到一種內建型別的轉換,然而這種內建型別本身是...
C 函式引數賦值
c 語法中有這樣一種規定 當呼叫函式時,沒有指定引數值,引數就會被賦預設值,但是,此函式必須是在第一次宣告或第一次定義的時候,給引數指定了預設值。在使用時應該注意以下幾點 第一點 引數預設值只允許設定一次,要麼在第一次函式宣告時設定,要麼在沒有函式宣告的情況下,在函式定義中設定 第二點 設定引數預設...
C 拷貝賦值函式
運用copy函式和copy assignment函式進行賦值操作應該注意的兩點 1 複製所有local成員變數 2 呼叫所有基類內的適當的copying函式。這裡面有乙個很可怕的規則 當你不用編譯器預設的拷貝函式或者賦值函式時,編譯器也不會對你自己寫的這兩個函式進行報警。所以必須要很謹慎和小心。對於...