C Primer 學習筆記 隱式類型別轉換

2021-06-19 00:30:49 字數 1978 閱讀 2674

1.了解

explicit用來防止由建構函式定義的隱式轉換。要明白它的作用,首先要了解隱式轉換:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的乙個隱式轉換。

#include #include using namespace std;

class fruit //定義乙個類,名字叫fruit

fruit(const string &nst, const string &cst = "green"):name(nst),colour(cst){} //建構函式

bool issame(const fruit &otherfruit) //期待的形參是另乙個fruit類物件,測試是否同名

void print() //定義乙個輸出名字的成員print()

fruit(const string &nst, const string &cst):name(nst),colour(cst){} //建構函式

bool issame(const fruit &otherfruit) //期待的形參是另乙個fruit類物件,測試是否同名

void print() //定義乙個輸出名字的成員print()

;bool same_isbn(sales_item book)

std::string null_book = "9-999-99999-9";

item.same_isbn(null_book);

item.same_isbn(cin);

使用乙個string型別物件作為實參傳給same_isbn函式,編譯器使用接收乙個string的sales_item建構函式從null_book生成乙個新的sales_item物件,新生成的(臨時的)sales_item被傳遞給same_isbn函式。

將cin隱式轉換為sales_item。這個轉換執行接收乙個istream的sales_item建構函式。該建構函式通過讀標準輸入來建立乙個(臨時的)sales_item物件。然後該物件被傳遞給same_isbn函式。

通過將建構函式宣告為explicit,可以防止在需要隱式轉換的上下文中使用建構函式:

class sales_item

;

explicit關鍵字只能用於類內部的建構函式宣告上。在類的定義體外部所做的定義上不再重複它。

// error: explicit只能用於類內部宣告上

explicit sales_item::sales_item(std::istream & is)

現在,兩個建構函式都不能用於隱式地建立物件,前兩個使用都不能編譯
item.same_isbn(null_book); // error

item.same_isbn(cin); // error

3.總結

c++ primer中提到:通常,除非有明顯的理由想要定義隱式轉換,否則,但形參建構函式應該為explicit。將建構函式設定為explicit可以避免錯誤,而且當轉換有用時,使用者可以顯式地構造物件。

google的c++規範中提到:explicit的優點是可以避免不合時宜的型別變換,缺點無。所以google約定所有單引數的建構函式都必須是顯示的,只有極少數情況下拷貝建構函式可以不宣告稱explicit。例如作為其他類的透明包裝器的類。

effective c++中提到:被宣告為explicit的建構函式通常比其non-explicit兄弟更受歡迎。因為它們禁止編譯器執行非預期(往往也不被期望)的型別 轉換。除非我有乙個好理由允許建構函式被用於隱式型別轉換,否則我會把它宣告為explicit。我鼓勵你遵循相同的政策。

4.參考文獻

scala學習筆記10 隱式類

隱式類 在scala2.10之後開始提供了隱式類,可以使用implicit宣告類,可以擴充套件類的功能 def main args array string unit 定義eat方法 var b1 newbird b1.fly 呼叫類中的方法 b1.eat 呼叫隱式類中的方法 class bird ...

C Primer 學習筆記 IO類

1.ifstream 和istringstream都繼承自istream,因此對三個類的物件的操作相似 2.io物件不能拷貝不能賦值 io操作的函式形參和返回值型別不能為流型別 進行io操作的函式常以引用方式傳遞和返回流,且不能為const 條件狀態 cin word 如果輸入成功,流會保持有效狀態...

scala隱式引數 隱式函式 隱式類詳解

隱式函式 隱式類1 定義乙個普通變數,使用 implicit 關鍵字修飾,定義乙個函式呼叫這個變數當引數時,此時這個引數就被稱為隱式引數 2 隱式引數的作用 減少提供函式引數的數量,讓某些引數擁有隱藏的值 隱式變數 def main args array string unit def fun2 a...