1. 程式人生 > >型別轉換建構函式

型別轉換建構函式

我們可以把數字當最物件賦給另一個物件,這樣在對該賦值表示式進行計算時,首先對數字進行型別轉換,同時判斷該類的建構函式的引數是否與數字型別匹配,假如匹配則呼叫建構函式建立一個臨時物件,跟著將該臨時物件賦給賦值操作符左邊的物件,最後呼叫解構函式進行刪除臨時物件。

示例程式碼如下:

#include <iostream>  
using namespace std;  
class A  
{  
    public:  
        A(int x){i=x;cout<<"建構函式執行! "<<i<<endl;}  
        ~A(){cout<<"解構函式執行! "<<i<<endl;}  
        void get(){cout<<i<<endl;}  
    private:  
        int i;  
};  
int main()  
{  
    A a(99);//呼叫A(int x)輸出"建構函式執行!99"  
    a.get();  
    cout<<"<<<<<<<<<<<<<<<<<<<<<<<\n"<<endl;  
      
    a=100;  //呼叫A(int x)將1000轉換成A類臨時物件並賦給a,  
            //輸出"建構函式執行!100"  
            //接著呼叫~A()將剛建立的臨時物件析構,  
            //輸出"解構函式執行!100"  
    a.get();//呼叫void get()輸出100  
    cout<<">>>>>>>>>>>>>>>>>>>>>>>\n"<<endl;  
      
    a=A(2); //呼叫A(int x)輸出"建構函式執行!2"  
            //生成臨時A類物件賦值給a  
            //賦值之後,呼叫~A(),臨時物件被銷燬,  
            //輸出"解構函式執行!2"  
    a.get();//呼叫void get()輸出2  
    //程式退出,銷燬a物件,呼叫~A(),輸出"解構函式執行!2"  
    cout<<"<<<<<<<<<<<<<<<<<<<<<<<\n"<<endl;  
      
    A b(35);//呼叫A(int x)輸出"建構函式執行!35"  
    //函式結束時析構的順序與構造正好相反,先析構物件b再析構第一個建立的物件a  
    //呼叫物件b的解構函式,輸出"解構函式執行!35"  
    //呼叫物件a的解構函式,輸出"解構函式執行!2"  
    cout<<">>>>>>>>>>>>>>>>>>>>>>>\n"<<endl;  
      
    return 0;  
}  

本示例有兩次型別轉換。第一次是“a=100”,該語句呼叫建構函式將100轉換為A類的臨時物件,然後將這個物件賦給物件a,跟著呼叫解構函式釋放臨時物件佔用的記憶體。

    第二次是“a=A(2)”,等號右邊的A(2)是一個強制型別表示式,這個表示式會呼叫A類建構函式,將括號內的2轉換成A類的臨時物件,然後再賦給左邊的物件a,跟著呼叫解構函式釋放臨時物件佔用的記憶體。