C 隱式型別轉換

2021-08-08 07:52:27 字數 1428 閱讀 6451

《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。explicit只能用於類內部建構函式的宣告。它雖然能避免隱式型別轉換帶來的問題,但需要使用者能夠顯式建立臨時物件(對使用者提出了要求)。

C 隱式型別轉換

c 定義了一組內建型別物件之間的轉換標準,在必要時它們被編譯器隱式的應用到物件上。發生隱式型別轉換的情景 1,在混合型別的算術表示式中 轉換原則 轉換為最寬的資料型別。也可叫,算術轉換。int ival 5 double dval 3.14 ival 被提公升為double型別 ival dval ...

C 隱式型別轉換

眾所周知,c 的基本型別中並非完全的對立,部分資料型別之間是可以進行隱式轉換的。所謂隱式轉換,是指不需要使用者干預,編譯器私下進行的型別轉換行為。很多時候使用者可能都不知道進行了哪些轉換。c 物件導向的多型特性,就是通過父類的型別實現對子類的封裝。通過隱式轉換,你可以直接將乙個子類的物件使用父類的型...

C 隱式型別轉換

可以用單個形參來呼叫的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。這裡應該注意的是,可以用單個形參進行呼叫 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。可以用單個形參來呼叫的建構函式有2種呼叫方式 隱式呼叫和顯示呼叫 以如下類為例 class a ...