程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++類型數據間的轉換

C++類型數據間的轉換

編輯:關於C++

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved