鄭莉等編著的<C++語言程式設計(第四版)>上類與對象章節,複制構造函數中提到複制構造函數被調用的三種情況,依次為
1)當用類的一個對象去初始化該類的另一個對象時系統自動調用拷貝構造函數實作拷貝指派
2)當函數的傳回值是類對象時,系統自動調用拷貝構造函數
3)如果函數的傳回值是類的對象,函數執行完成傳回調用者時
并舉了一個例子,并特别說明了一點:
在有些編譯環境下,該例子的運作結果可能不盡相同,因為編譯器有時會針對複制構造函數(拷貝構造函數)的調用做優化,避免不必要的複制構造函數調用;
為了探究複制構造函數被調用的情況,并驗證該情況,現書中例子,做了一個修改,修改處,圖檔也已經注明,源代碼如下
#include "iostream.h"
using namespace std;
class Point {public:
Point(int xx=0,int yy=0) {
x=xx;
y=yy;
}
Point(Point &p);
int getX() {
return x;
}
int getY() {
return y;
}
private:
int x,y;
};
Point::Point(Point &p) {
x=p.x+1;
y=p.y;
cout<<"Calling the copy constructor"<<endl;
}
void fun1(Point p) {
cout<<p.getX()<<endl;
}
Point fun2() {
Point a(1,2);
return a;
}
int main() {
Point a(4,5);
Point b=a;
cout<<b.getX()<<endl;
fun1(b);
b=fun2();
cout<<b.getX()<<endl;
return EXIT_SUCCESS;
}
依次在Mac系統的編譯器Xcode,linux系統終端編譯,和Windows系統VC6.0下運作,結果分别如下,
能夠編譯成功的為:Mac的xcode下與windows的VC++6.0但值不一樣.
編譯不通過的為:在Linux終端提示錯誤,并且在windows下的CodeWarrior和GUN的g++編譯都回提示拷貝構造函數參數錯誤,CodeWarrior中還指出拷貝構造函數的參數不能是右值。