1. 程式人生 > >C++構造函數和析構函數初步認識(2)

C++構造函數和析構函數初步認識(2)

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)