explicit建構函式之物件的隱式轉換

2021-10-12 17:43:53 字數 747 閱讀 4415

物件的隱式轉換:

對於類型別來說,非同型別的單引數建構函式定義了一條從該引數的型別向該類型別進行隱式轉換的規則。

當採用單個實參的初始式時,編譯器會自動根據實參的型別,呼叫單引數建構函式還是複製建構函式。

例如, std::string 有乙個單引數建構函式 string(const char*); ,從而使得可以使用字串字面 「hello」 直接去呼叫單引數建構函式,建立乙個string 物件,相當於執行了string s = 「hello」 ,而不是去呼叫複製建構函式,執行了從字串字面量物件到 string 物件的隱式轉換。

void

f(string s);f

("hello"

)

但是,在許多情況下隱式轉換容易導致問題。例如,下面的**不小 心使用 10 錯誤地作了乙個呼叫 f(10) ,但是編譯器不會報錯。

classa;

void

f(a a)

;//...f(

10);//可以執行

為了防止這種錯誤,可以使用 explicit 修飾單引數建構函式,要求使用 值進行單引數初始化時,只能作複製初始化,禁止實參到物件的隱式轉換

classa;

void

f(a a)

;//...f(

10);//錯誤 f(a

);//可以執行

explicit建構函式

按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 class string string s1 hello ok 隱式轉換,等價於string s1 string hello 但是有的時候可能會不需要這種隱式轉換,如下 class s...

explicit建構函式

在閱讀slicer原始碼時,遇見explicit修飾的建構函式,比較迷惑 explicit qslicerigsreadermodule qobject parent 0 下面就解釋這個問題。按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下...

Qt C 建構函式與explicit

1 預設建構函式 預設建構函式是指所有引數都提供了預設值的建構函式,通常指無參的建構函式或提供預設值的建構函式。如類test1和test2的建構函式 class test1 default constructor 或 class test2 default constructor 如果你沒有為你的類...