備注:有些代碼注釋掉了,因為不能同時運作多個main函數。如果測試打開即可,後面有注釋,多看看
#include "iostream"
using namespace std;
class Test4
{
private:
int m_a;
int m_b;
public:
Test4()
{
m_a=0;
m_b=0;
cout<<"無參構造函數"<<endl;
}
Test4(int a,int b)//有參數構造函數
{
m_a = a;
m_b = b;
cout<<"有參數構造函數"<<endl;
}
Test4(const Test4& obj){
cout<<"我也是構造函數"<<endl;
}
Test4(int a){
m_a = a;
m_b = 0;
cout<<"一個參數構造函數"<<endl;
}
};
class Location
{
public:
Location(int xx=0,int yy=0)
{
X = xx; Y = yy; cout<<"Constructor Object.\n";
}
//完成對象的初始化
Location(const Location & obj)//拷貝構造函數
{
X = obj.X; Y = obj.Y;
}
~Location()
{
cout<<X<<","<<Y<<"Object destroyed."<<endl;
}
int getX(){return X;}
int getY(){return Y;}
private:
int X,Y;
};
//業務函數 形參是一個元素
void f(Location p)
{
cout<<p.getX()<<endl;
}
//g函數傳回一個元素
//結論:函數的傳回值是一個元素(複雜類型),傳回的是一個新的匿名對象(是以會調用匿名對象類的拷貝構造函數)
//匿名對象的去和留
//如果用匿名對象初始化另外一個同類型對象,那麼匿名對象直接轉成有名對象。
//如果用匿名對象指派給另外一個同類型的對象,那麼匿名對象被析構。
Location g()
{
Location A(1,2);
return A;
}
//指派構造函數(拷貝構造函數)用一個對象去初始化另外一個對象。
//第二種調用方法
//第三種調用方法
//拷貝構造函數的第四種應用場景
void objplay2()
{
g();
}
void objplay3()
{
//用匿名對象初始化m,此時c++編譯器直接把匿名對象轉成m;從匿名轉換成有名字m。
Location m = g();
cout<<m.getX()<<endl;
}
void main()
{
objplay3();
system("pause");
}