淺談C++類--隱式類類型轉換

轉載自 “九天雁翎”

鏈接:http://blog.csdn.net/vagrxie/article/details/1586340


例4.0:

#include <string>
#include <iostream>
using namespace std;
class Fruit               //定義一個類,名字叫Fruit
{
 string name;     //定義一個name成員           
 string colour;   //定義一個colour成員
 
public:
 bool isSame(const Fruit &otherFruit)   //期待的形參是另一個Fruit類對象,測試是否同名
 {
  return name == otherFruit.name;
 }
 void print()              //定義一個輸出名字的成員print()
 {
  cout<<colour<<" "<<name<<endl;
 }
 Fruit(const string &nst,const string &cst = "green"):name(nst),colour(cst){}  //構造函數
 
 Fruit(){}
};

int main()
{
 Fruit apple("apple");
 Fruit orange("orange");
 cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl;  //沒有問題,肯定不同
 cout<<"apple = /"apple/" ?:"<<apple.isSame(string("apple")); //用一個string做形參?
 
    return 0;
}

你會發現最後的使用上,我們用一個string類型作一個期待Fruit類形參的函數的參數,結果竟然得出了是true(1),不要感到奇怪,這就是我現在要講的東西,隱式類類型轉換:“可以用單個實參來調用的構造函數定義了從形參類型到該類型的一個隱式轉換。”(C++ Primer)首先要單個實參,你可以把構造函數colour的默認實參去掉,也就是定義一個對象必須要兩個參數的時候,文件編譯不能通過。然後滿足這個條件後,系統就知道怎麼轉換了,不過這裏比較嚴格:)以前我們構造對象的時候Fruit apple("apple")其實也已經有了一個轉換,從const char *的C字符串格式,轉爲string,在這裏,你再apple.isSame("apple")的話,蠢系統不懂得幫你轉換兩次,所以你必須要用string()來先強制轉換,然後系統才知道幫你從string隱式轉換爲Fruit,當然其實你自己也可以幫他完成。cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple"));這樣。參考例子1.2 :Fruit apple = Fruit("apple");  //定義一個Fruit類對象apple。也就是這樣轉換的。不過這就叫顯式轉換了,我們不標出來,系統幫我們完成的,叫隱式的貝。這裏要說的是,假如你顯示轉換就可以不管有多少參數了,比如在前面提到的必須需要兩個參數的構造函數時的例子。

例4.1:

#include <string>
#include <iostream>
using namespace std;
class Fruit               //定義一個類,名字叫Fruit
{
 string name;     //定義一個name成員           
 string colour;   //定義一個colour成員
 
public:
 bool isSame(const Fruit &otherFruit)   //期待的形參是另一個Fruit類對象,測試是否同名
 {
  return name == otherFruit.name;
 }
 void print()              //定義一個輸出名字的成員print()
 {
  cout<<colour<<" "<<name<<endl;
 }
 Fruit(const string &nst,const string &cst):name(nst),colour(cst){}  //構造函數
 
 Fruit(){}
};

int main()
{
 Fruit apple("apple","green");
 Fruit orange("orange","yellow");
 cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl;  //沒有問題,肯定不同
 cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple","green")); //顯式轉換 
    return 0;
}

在你不想隱式轉換,以防用戶誤操作怎麼辦?C++提供了一種抑制構造函數隱式轉換的辦法,就是在構造函數前面加explicit關鍵字,你試試就知道,那時你再希望隱式轉換就會導致編譯失敗,但是,要說明的是,顯式轉換還是可以進行,出於不提供錯誤源代碼例子的原則,錯誤的情況就不提供了,自己試試吧:)在說這個東西之前,我還不懂,現在我懂了:)我現在好像都習慣邊學邊講了,有什麼錯誤,你可要指出來啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章