隱式類型別轉換

2021-09-30 05:26:08 字數 1191 閱讀 3459

c++ primer

中有這麼一句話:可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。

這麼解釋:

比如有個類a的物件a的成員函式的引數應該是類a的物件,但是把乙個別的型別b的物件b傳進去了,而且這個物件b的型別恰好是a的單引數構造函式引數型別,這時系統就用這個b自作聰明的建立了乙個類a的臨時物件c,雖然c和a都是a型別,但是是不同的物件。

這種隱式轉換有很大風險,可以用explicit加在單引數建構函式前來避免這種類類**轉換。

我個人認為這就是一種人為使用錯誤,而編譯器又恰恰沒有指出。

本來應該a.a(a(b)),憑什麼用成a.a(b)?哈哈……

#include

#include

using

namespace

std;

class

fruit

//定義乙個類,名字叫

fruit

void

print()

//定義乙個輸出名字的成員

print()

fruit(

const

string& nst,

const

string& cst =

"green"

):name(nst), colour(cst){}

fruit(){} };

intmain()

你會發現最後的使用上,我們用乙個string型別作乙個期待fruit類形參的函式的引數,結果竟然得出了是true(1),不要感到奇怪,這就是我現在要講的東西,隱式類型別轉換:「可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。」(c++ primer)

首先要單個實參,你可以把建構函式colour的預設實參去掉,也就是定義乙個物件必須要兩個引數的時候,檔案編譯不能通過。然後滿足這個條件後,系統就知道怎麼轉換了,不過這裡比較嚴格

這裡要說的是,假如你顯示轉換就可以不管有多少引數了,比如在前面提到的必須需要兩個引數的建構函式時的例子。

intmain()

在你不想隱式轉換,以防使用者誤操作怎麼辦?

c++提供了一種抑制建構函式隱式轉換的辦法,就是在建構函式前面加explicit關鍵字,你試試就知道,那時你再希望隱式轉換就會導致編譯失敗,但是,要說明的是,顯式轉換還是可以進行,出於不提供錯誤源**例子的原則,錯誤的情況就不提供了,自己試試吧

隱式類型別轉換

c primer 中有這麼一句話 可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。這麼解釋 比如有個類a的物件a的成員函式的引數應該是類a的物件,但是把乙個別的型別b的物件b傳進去了,而且這個物件b的型別恰好是a的單引數構造函式引數型別,這時系統就用這個b自作聰明的建立了乙個類...

C 類型別隱式轉換

隱式類型別轉換 可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。c primer 首先要單個實參,你可以把建構函式colour的預設實參去掉,也就是定義乙個物件必須要兩個引數的時候,檔案編譯不能通過。以上只是將內建型別轉換為自定義型別 過載double,int 將使用者自定義資...

C 隱式類型別轉換

c primer 中提到 可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。這裡應該注意的是,可以用單個形參進行呼叫 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。那麼,什麼是 隱式轉換 呢?上面這句話也說了,是從 建構函式形參型...