C++構造函數和析構函數初步認識(2)
阿新 • • 發佈:2019-01-25
namespace 要求 get using std exp uil 運行 必須
構造函數的三個作用
1.構造對象
2.對象初始化
3.類型轉換
//Test1.h #include<iostream> using namespace std; //構造對象 //初始化對象 //類型裝換 class ST { private: int a; long b; public: ST(int a=0);//缺省的構造函數只允許有一個 ST(long b); ST(int a, long b); ~ST() { cout<<"ST was Free. "<<this<<endl; } operator int(); operator long(); int Get_a(); void fill(int a, long b); }; ST::ST(int a) { cout<<"ST was Built. "<<this<<endl; this->a = a; } ST::ST(int a, long b) { cout<<"ST was Built. "<<this<<endl; this->a = a; this->b = b; } ST::ST(long b) { cout<<"ST was Built. "<<this<<endl; this->b = b; } ST::operator int() { return this->a; } ST::operator long() { return this->b; } int ST::Get_a() { return this->a; } void ST::fill(int a, long b) { this->a = a; this->b = b; }
//Test.cpp #include<iostream> #include"Test1.h" using namespace std; void main() { ST st; int a1,a2,a = 100; long b1,b = 1000; st = a;//此處為一個隱式轉換,產生了一個中間變量,構造函數使a轉換為ST類型,然後用此中間變量給st.a賦值 //這樣的強制轉換是對構造函數有要求的,若構造函數無參數或者其參數有多個則不能進行轉換 a = 101;//值得關註的一個問題是,a被構造函數轉換並賦值給st.a後,其便會被析構掉,不需要等到程序結束 st = (ST)a;//也可以將其顯式的寫出來,只要其構造函數無explicit前綴,則顯式隱式都可以,若含有exitplic前綴則必須顯式類型轉換 st = b;//有兩個重載的構造函數可以進行轉換,轉化時系統可由構造函數參數列表自動識別為其選擇構造函數 //由於是st接收轉換類型後的b值,若構造函數內僅對一個私有數據成員進行賦值,則其他私有成員皆為隨機值 //這也就是為何st先接收a的賦值,再接收b的賦值後其私有數據成員st.a變為隨機值的原因 st.fill(10,20); a1 = st;//C++沒有默認的從對象到數據類型的轉換,若想要轉換則必須寫一個方法,或者使用operator將類型轉換的方法寫出來 a2 = st.Get_a();//此方法和上一行的代碼效果相同 b1 = st; cout<<"a1 = "<<a1<<" a2 = "<<a2<<endl; cout<<"b1 = "<<b1<<endl; }
運行結果
C++構造函數和析構函數初步認識(2)