1. 拷貝構造函數調用的三種情形
<1> 函數傳參時使用對象進行值傳遞
<2> 函數直接返回某個類對象的值
<3> 使用一個對象去初始化另一個同類的對象,包括兩種方式:
部分代碼:
class test
{};
test T;
test A(T); //第一種方式
test B=T; //第二種方式
2.爲什麼拷貝構造函數的參數爲什麼是引用類型?
假設拷貝構造函數爲值傳遞,這符合上述的拷貝構造函數調用情形1.<1>,值傳遞時要再次調用拷貝構造函數,如此循環下去會造成無限遞歸調用拷貝構造函數而發生棧溢出。故拷貝構造函數的參數必須是引用類型。
3.什麼是棧溢出?通常什麼情況下會發生棧溢出?
編譯器會給程序的調試運行預留指定大小的內存緩衝區,其中包含了堆區、棧區等等。一般從main函數開始,棧區會給所有已調用未返回的函數動態開闢空間以確保函數的正常執行,函數執行結束後空間會自動回收。當棧爲函數運行開闢的總空間超過所允許的最大值而到了非棧的其他區域,這種情況就是棧溢出。
棧溢出是緩衝區溢出的一種,導致其發生的原因通常有三個:
<1> 遞歸調用函數過深
<2> 局部變量所佔總內存過大
<3> 設置的棧空間過小