C 對傳參和傳返回值時構造的優化處理

2022-08-23 17:06:13 字數 1770 閱讀 2187

(1) 建構函式

成員變數為私有的,要對它們進行初始化,必須用乙個公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時

呼叫的函式稱為建構函式(constructor) 。

建構函式是特殊的成員函式,其特徵如下:

a. 函式名與類名相同。

b. 無返回值。

d. 建構函式可以過載。

e.建構函式可以在類中定義,也可以在類外定義。

f.如果類定義中沒有給出建構函式,則c++編譯器自動產生乙個預設的建構函式,但只要我們定義了乙個建構函式,系統就不會自動 生成預設的建構函式。

(2) 拷貝建構函式

建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式(copy constructor),拷貝建構函式是特殊的建構函式。

特徵:

a. 拷貝建構函式其實是乙個建構函式的過載。

b. 拷貝建構函式的引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。(思考為什麼?)

c. 若未顯示定義,系統會預設預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化。

賦值運算子的過載是對乙個已存在的物件進行拷貝賦值。

g. 無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有乙個。

(3) 賦值運算子過載

拷貝建構函式是建立的物件,使用乙個已有物件來初始化這個準備建立的物件。

(4) 析構函式

當乙個物件的生命週期結束時,c++編譯系統會自動呼叫乙個成員函式,這個特殊的成員函式即析構函式(destructor)

建構函式是特殊的成員函式,其特徵如下:

a. 析構函式在類名加上字元~。

b. 析構函式無引數無返回值。

c. 乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。

d. 物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。

e. 注意析構函式體內並不是刪除物件,而是做一些清理工作。

系統在什麼情況下會進行優化呢?

當拷貝構造存在連續的賦值情況的時候,

當多個臨時物件連續賦值的時候

簡單點來說就是,再一次拷貝構造結束後,並沒有直接返回給要建立的物件而是又再次進行了拷貝構造。或者是,建立乙個臨時物件,來進行拷貝構造,然後又返回了乙個臨時物件,再用這個返回的臨時物件繼續拷貝構造。這時候,系統就會自動優化。

下面來看乙個題來理解一下這個優化的問題。

//   test1中呼叫了_2__次aa的拷貝建構函式,_1__次aa的賦值運算子函式的過載。 

// test2中呼叫了_2__次aa的拷貝建構函式,__0_次aa的賦值運算子函式的過載。

// test3中呼叫了__3_次aa的拷貝建構函式,__0_次aa的賦值運算子函式的過載。

class

aa{};

aa f (aa

a)void test1

()void test2

()void test3

()

下面就來分析一下,為什麼會是這個答案

C 對傳參和傳返回值時構造的優化處理

如果讀者不太了解c 的四個預設成員函式,可以看這篇部落格 enter link description here 有時候c 的編譯器會對我們的 進行優化處理,使我們很困惑。實際上,這些優化都是有跡可循的,不是雜亂無章的。當多個臨時物件連續賦值的時候 簡單點來說就是,在一次拷貝構造結束後,並沒有直接返...

C 對傳參和傳返回值時構造的N中優化處理

系統在什麼情況在會進行優化呢?1.當拷貝構造存在連續賦值的情況的時候 2.當多個臨時物件連續賦值的時候,簡單來說就是就是,再一次拷貝構造結束後,並沒有直接返回要建立的物件,而是再一次進行了拷貝構造,或者建立乙個臨時物件,來進行拷貝構造,然後又返回乙個臨時物件,在用這個返回的臨時物件繼續拷貝構造,這是...

函式傳參以及函式的返回值

1.形式 其中在函式內部的a叫做形參,而呼叫函式裡的100叫做實參 function 在此處傳參 fn1 100 function fn1 a 可以相當於 fn1 100 function fn1 var a 100 但不能這麼寫2.也可以傳多個引數,如 fn1 100,px function fn...