c++ 隱式類型別轉換
《c++ primer》中提到:
「可以用 單個形參來呼叫 的建構函式定義了從形參型別到該類型別的乙個隱式轉換。」
這裡應該注意的是, 「可以用單個形參進行呼叫」 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。
那麼,什麼是「隱式轉換」呢? 上面這句話也說了,是從 建構函式形參型別 到 該類型別 的乙個編譯器的自動轉換。
下面通過**來看一看:
#include "stdafx.h"
#include
#include
using
namespace
std ;
class book //定義了乙個書類
//類的建構函式,即那個「能夠用乙個引數進行呼叫的建構函式」(雖然它有兩個形參,但其中乙個有預設實參,只用乙個引數也能進行呼叫)
book(string isbn,float price=0.0f):_bookisbn(isbn),_price(price){}
};int main()
**中可以看到,issameisbn函式是期待乙個book類型別形參的,但我們卻傳遞了乙個string型別的給它,這不是它想要的啊!還好,book類中有個建構函式,它使用乙個string型別實參進行呼叫,編譯器呼叫了這個建構函式,隱式地將stirng型別轉換為book型別(構造了乙個book臨時物件),再傳遞給issameisbn函式。
隱式類型別轉換還是會帶來風險的,正如上面標記,隱式轉換得到類的臨時變數,完成操作後就消失了,我們構造了乙個完成測試後被丟棄的物件。
我們可以通過explicit宣告來抑制這種轉換:
explicit book(string isbn,float price=0.0f):_bookisbn(isbn),_price(price){}
現在使用者只能進行顯示型別轉換,顯式地建立臨時物件。
總結一下:
可以使用乙個實參進行呼叫,不是指建構函式只能有乙個形參。
隱式類型別轉換容易引起錯誤,除非你有明確理由使用隱式類型別轉換,否則,將可以用乙個實參進行呼叫的建構函式都宣告為explicit。
explicit只能用於類內部建構函式的宣告。它雖然能避免隱式型別轉換帶來的問題,但需要使用者能夠顯式建立臨時物件(對使用者提出了要求)。
隱式類型別轉換以及explicit
先有如下建構函式版本 class sales item sales item std istream is 原本的成員函式same isbn 接收乙個sales item物件作為實參,判斷兩個物件是否對應的是同一本書。但是 string null book 9 99 9999 item.same i...
隱式類型別轉換
c primer 中有這麼一句話 可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。這麼解釋 比如有個類a的物件a的成員函式的引數應該是類a的物件,但是把乙個別的型別b的物件b傳進去了,而且這個物件b的型別恰好是a的單引數構造函式引數型別,這時系統就用這個b自作聰明的建立了乙個類...
隱式類型別轉換
c primer 中有這麼一句話 可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。這麼解釋 比如有個類a的物件a的成員函式的引數應該是類a的物件,但是把乙個別的型別b的物件b傳進去了,而且這個物件b的型別恰好是a的單引數構造函式引數型別,這時系統就用這個b自作聰明的建立了乙個類...