C 初級主題 6 賦值函式

2021-07-26 14:34:27 字數 1873 閱讀 9248

賦值語句其實是對「=」進行過載。

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函式。這裡面有乙個很可怕的規則 當你不用編譯器預設的拷貝函式或者賦值函式時,編譯器也不會對你自己寫的這兩個函式進行報警。所以必須要很謹慎和小心。對於...