#include<iostream.h>
/*
拷貝初始化建構函式實驗代碼
拷貝初始化建構函式的功能就是用一個自己已知的對象來初始化一個對象。在下述三種情況下需要用拷貝初始化建構函式來用一個對象初始化
另一個對象。
1.明確表示由一個對象初始化一個對象時。如:TPoint P2(P1);
2.當對象作為函數實參傳遞給函數形參時.如:P=f(N);
3.當對象作為函數傳回值時.如:return R; 執行返回語句return R;時系統將用對象R來初始化一個匿名對象,這時需要調用拷貝初始化建構函式.
*/
class TPoint
{
public:
TPoint(int x,int y)
{
X=x;
Y=y;
//cout<<"Constructor Called/n";
}
TPoint(TPoint &p);
~TPoint()
{
cout<<"Destructor Called. /n";
}
int Xcoord()
{
return X;
}
int Ycoord()
{
return Y;
}
private:
int X,Y;
};
TPoint::TPoint(TPoint &p)
{
X = p.X;
Y = p.Y;
cout<<"Copy Initialization Constructor Called./n";
}
TPoint f(TPoint Q);
void main()
{
TPoint M(20,35);
TPoint P(0,0);
TPoint N(M); //1.明確表示由一個對象初始化一個對象時,調用拷貝初始化建構函式
P=f(N); //2.當對象作為函數實參傳遞給函數形參時,調用拷貝初始化建構函式
cout<<"P="<<P.Xcoord()<<","<<P.Ycoord()<<endl;
}
TPoint f(TPoint Q)
{
cout<<"ok/n";
int x,y;
x=Q.Xcoord()+10;
y=Q.Ycoord()+20;;
TPoint R(x,y);
return R; //3.當對象作為函數傳回值時,系統將用對象R來初始化一個匿名對象,這時需要調用拷貝初始化建構函式
}
/*
程式運行結果:
Copy Initialization Constructor Called.
Copy Initialization Constructor Called.
ok
Copy Initialization Constructor Called.
Destructor Called.
Destructor Called.
Destructor Called.
P=30,55
Destructor Called.
Destructor Called.
Destructor Called.
Press any key to continue
結果說明:
1.拷貝初始化建構函式共使用了三次.具體說明前面已說明.
2.解構函式調用:在退出f()函數時,本函數中定義的對象被釋放,系統自動調用其解構函式.這裡共調用了二次.一次是用來釋放對象Q,另一次是
是用來釋放對像R.
在返回主函數main()後,用賦值運算子將其匿名對象的值賦給對象P,然後釋放匿名對象,這時又調用了一次解構函式.
最後,退出整個程式時,又調用了三次解構函式,分別是用來釋放主函數中定義的對象M,P和Nr .
所以總共調用6次解構函式.
*/