C++是一種復雜的語言,其中有許多“好玩”的特性,學習C++的過程就像在海邊撿一顆顆石頭,只要堅持不懈,也許一顆顆小石頭也能建起你自己小小的城堡。
廢話完後,講講自己撿到的石頭:隱式類型轉換
學習出處:《Effective C++》 lostmouse大人翻譯
class TestInt
{
public:
int GetData()const{ return i;};
TestInt(int ii):i(ii){}; //構造函數
private:
int i;
};
void fun(TestInt t)
{
cout<<t.GetData()<<endl;
}
int main()
{
fun(10);
return 0;
}
運行結果:
10
為啥fun函數需要的是TestInt的類型的參數,而傳進去int 也可以呢,
尋找原因之前,我們先把構造函數注釋掉,再重新編譯,結果這次直接報錯error: conversion from ‘int’ to non-scalar type ‘TestInt
好像有點眉目了,之前能夠調用成功估計和類的這個構造函數有關,其實這就是C++中的隱式類型轉換:
編譯器知道傳個fun的值是int而函數需要的是TestInt,但他也同時知道調用TestInt的構造函數將int轉換成一個合適的TestInt,
我們知道函數傳值是會生成一個臨時變量,現在的情況就類似 const TestInt t(10),所以結果就如上面所示。
《Effective C++》中一個例子:
class Month {
public:
static const Month Jan() { return 1; }
static const Month Feb() { return 2; }
...
static const Month Dec() {
return 12; }
int asInt() const // 為了方便,使Month
{ return monthNumber; }
// 可以被轉換為int
private:
Month(int number): monthNumber(number) {}
const int monthNumber;
};
一開始不明白如何調用這個類,而且對 static const Month Jan() { return 1; }
這個函數的返回值有很大的疑問,為啥返回類型是Month,但函數能返回一個int呢。
想不通,只好敲進編譯器試錯,經過一次次的出錯,終於弄清這個類的用法,
其實這個類就是想得到一個const的月份:Month jan = Month::Jan(); 這樣就得到代表一月份的對象。
而 static const Month Jan() { return 1; } 能夠成功就是利用了隱式類型轉換,只是現在的構造函數是
私有的,為的是防止用戶創建新的month。
“只通過看游泳的書,並不能讓你真正學會游泳”,編程也是如此。