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

C++的隱式類型轉換,類型轉換

編輯:C++入門知識

C++的隱式類型轉換,類型轉換


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。

 

“只通過看游泳的書,並不能讓你真正學會游泳”,編程也是如此。

 

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