copy建構函式是乙個極其重要的函式,因為它定義乙個物件如何通過pass-by-value(以值傳遞)。舉個例子,考慮以下**:
boolhasacceptablequality(widget w);
...widget awidget;
if(hasacceptablequality(awidget))...
引數w是以by-value方式傳遞給hasacceptablequality,所以在上述呼叫中,awidget被複製到w體內,這個動作由類widget的copy建構函式完成。pass-by-value意味著呼叫copy建構函式。
關於copy建構函式本身的定義有乙個必須注意的地方就是引數要定定義為引用傳參。
classwidget
在面試中經常會遇到這樣一類題型。分析以下程式的編譯和執行結果:
#includeusing namespace std;
class
person
person(person per)
void print()
};int
main()
答案是編譯錯誤。在上述**中 person b=a,呼叫了copy建構函式。然而在類定義體中,copy建構函式person(person per)傳入的引數是person的乙個例項。由於是傳值引數就會呼叫copy建構函式。因此如果允許copy建構函式傳值,就會造成在copy建構函式中呼叫copy建構函式,形成無休止的遞迴導致棧溢位。因此c++的標準不允許copy建構函式傳值,在visiual studio和gcc編譯器中都將出錯。
copy建構函式
防止傳值方式傳遞 我們也許會說 如果我自己不寫拷貝建構函式,編譯器將為我建立。所以,我怎麼能保證乙個物件永遠不會被通過傳值方式傳遞呢?有乙個簡單的技術防止通過傳值方式傳遞 宣告乙個私有 p r i v a t e 拷貝建構函式。我們甚至不必去定義它,除非我們的成員函式或友元 f r i e n d ...
關於建構函式
class foo foo char x,int y 上面例子中,foo x,0 語句並不呼叫當前物件的foo char x,int y 函式,而是產生乙個臨時物件並對其初始化,然後在語句結束時 分號處 銷毀臨時物件。因此當前物件並未得到初始化,這恐怕出乎很多人的意料。解決這個問題,常見的辦法是合併...
關於建構函式
1 每個類必須有乙個建構函式,否則沒法建立物件 2 若programer沒有提供任何建構函式,則c 提供乙個預設的建構函式,該預設建構函式是無參建構函式,它僅負責建立物件,不做任何初始化的工作 3 只要programer定義了乙個建構函式 不管是無參還是有參構造 c 就不再提供預設的預設建構函式。即...