1.標准類型數據間的轉換
1.1隱式類型轉換
int i=6;
i=4.5+i; [Warning] converting to `int' from `double'
cout<<i<<endl;
結果:
10
這裡編譯器會給 出警告,因為編譯器會對4.5做double類型處理,在求解表達式時,6轉換成double,然後 與4.5相加,得到10.5,在向整型變量賦值時,將10.5轉為為整數10,然後賦給i。整個過 程由C++編譯器自動完成,因此此類轉換稱為隱式類型轉換。
1.2顯式類型轉換
C++也提供顯式類型轉換,其形式為,
類型名(數據),如int(11.1);// 將11.1轉換成整型11。
2.用轉換構造函數進行類型轉換
2.1什麼是轉換構 造函數
通常把有一個參數的構造函數用作類型轉換,稱其為轉換構造函數(有一 個參數的構造函數也可以不用做類型轉換)。轉換構造函數的作用是將一個其他類型的數 據轉換成一個類的對象。
2.2四種類型的構造函數
到目前為止,已經接觸 了4種類型的構造函數,它們分別是(用例為一復數類Complex),
【1】默認構造 函數。
Complex();//沒有參數
或
Complex(double=0,double=0);// 提供默認的參數值
【2】用於初始化的構造函數
Complex(double r,double i);//形參列表一般有兩個以上參數
【3】復制構造函數
Complex(Complex&);//形參是本類對象的引用
【4】轉換構造函數
Complex(double r){
real=r;
imag=0;
}
其作用是將double型的參數轉換成Complex類的對象,將r作為復數實部, 虛部為0。
2.3轉換構造函數的使用
使用轉換構造函數將一個指定的數據轉 換為類對象的方法:
【1】先聲明一個類(如上面的Complex);
【2】在 這個類中定義一個只有一個參數的構造函數,參數的類型是需要轉換的類型,在函數體中 指定轉換的方法;
【3】在該類的作用域內可以用以下形式進行類型轉換,
類名(指定類型的數據)
2.4一個實例
【1】提出問題
下面 給出一個復數類Complex,提供了2種構造函數。
class Complex{
public:
Complex(double r,double i){//用於初始化的構造函數
real=r;
imag=i;
}
Complex(double r){//轉換構造函 數
real=r;
imag=0;
}
private:
double real,imag;
};
int main(){
Complex c(0,0); //使用初始化 構造函數
c=c+2.5;error: no match for 'operator+' in 'c + 2.5e+0'
這裡報錯,意思是+號運算符沒有被重載以用於Complex類對 象與double之間的操作。
【2】使用重載加運算符的方式修復之
class Complex{
public:
…
Complex operator+(double);//聲明重載運算符+
…
};
Complex Complex:: operator+(double r){
return Complex(real+r,imag);
}
int main(){
Complex c(0,0);
c=c+2.5; //ok
【3】 使用轉換構造函數的方式修復之
將2.5先轉換成Complex類類型,然後重載運算符+ 對兩個類對象間實現+操作。
class Complex{
public:
Complex(double r,double i){
real=r;
imag=i;
}
Complex(double r){
real=r;
imag=0;
}
Complex operator+(Complex&);//重載+運算符
…
};
Complex Complex:: operator+(Complex &c){
return Complex (real+c.real,imag);
}
int main(){
Complex c(0,0);
Complex c1(2.5);//使用轉換構造函數
c=c+c1;
...
不僅 可以將一個標准類型數據轉換成類對象,也可以將另一個類的對象轉換成轉換構造函數所 在的類對象。下面定義一個從類Student到類Teacher的轉換。
Teacher (Student&s){
num=s.num;
strcpy(name,s.name);
sex=s.sex;
}
用轉換構造函數可以將一個指定類型的數據轉換為類 的對象。但是不能反過來將一個類的對象轉換為一個其他類型的數據(如將一個Complex 類對象轉換成double)。下面介紹類型轉換函數可以實現這一點。
3.用類型轉換 函數進行類型轉換
類型轉換函數(type conversion function)作用是將一個類 的對象轉換成另一類型的數據。
類型轉換的一般形式為,
operator 類型名(){
實現轉換的語句
}
在函數名前不能指定函數類型 ,函數沒有參數。在下面的例子中,Complex類提供將一個Complex對象轉換為double的類 型轉換函數。
class Complex{
public:
Complex(double r=0,double i=0){
real=r;
imag=i;
}
operator double(){//類型轉換函數
return real;
}
private:
double real,imag;
};
int main(){
Complex c;
double d;
d=c+2.5;//ok
system ("PAUSE");
return EXIT_SUCCESS;
}
由此可見 ,轉換構造函數與類型轉換函數有一個共同的功能:當需要的時候,編譯器會自動調用這 些函數,建立一個無名的臨時對象(或臨時變量),實現類型間的轉換。
轉換構 造函數完成的是由標准數據類型(或一個類類型)轉換至當前類類型;類型轉換函數完成 的是由當前類類型轉換至標准數據類型。
本文出自 “子 孑” 博客, 請務必保留此出處http://zhangjunhd.blog.51cto.com/113473/57650