C 隱式轉換與顯式轉換

2022-06-28 23:18:12 字數 1936 閱讀 6303

普通型別的轉換順序:隱式把char——>int和從short——>double。轉換可能會導致資料的丟失。

自定義型別:有兩種函式可以進行隱式轉換,單引數建構函式 和 隱式型別轉換符。

自定義型別可以用函式前+ explicit 關鍵字,防止轉換。

單個引數的建構函式,或可傳單個引數的類建構函式

example 1:

class things

int compareto(const things & other);

std::string m_name;

int height;

int weight;

};這裡things的建構函式可以只用乙個實參完成初始化。所以可以進行乙個隱式轉換,像下面這樣:

things a;

................//在這裡被初始化並使用。

std::string nm = "book_1";

//由於可以隱式轉換,所以可以下面這樣使用

int result = a.compareto(nm); 

things xx = str; //這也會呼叫隱式轉換

struct month

int val;

};date(const month& a);

date(2);  //這樣就呼叫了隱式轉換

struct month

int val;

};date(2); //這樣就會出錯

date(month(2));   //必須這樣

example 2:

class rational 

rational(name name)             // 轉換name型別到 有理數類rational

rational(string str)           // 轉換string型別 到有理數類

};char ch = 'a';

string str;

name name(str);

int i = 3;

rational ra;

//以下均right

ra = i;                //執行rational(int numerator = 0,int denominator = 1)轉換

ra = ch;             //執行rational(int numerator = 0,int denominator = 1)轉換

ra = str;            //執行rational(string str)轉換

ra = name;        //執行rational(name name)轉換

隱式型別轉換運算子: 就是 operator 關鍵字,氣候跟乙個型別符號

class rational 

operator string () const            // 轉換rational類成 string型別

};str = ra;      //執行operator string()轉換string 執行崩潰

i = 1*ra;     //執行operator double()轉換成double型

cout<

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

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

**:

隱式轉換 vs 顯式轉換

js資料型別分為兩種 基本資料型別 原始型別 引用資料型別 物件型別 基本資料型別 number string boolean undefined null symbol es6新出 引用資料型別 object 物件型別 其中涉及最多的隱式轉換的運算子是 和 運算子 1 如果 的一端是string型...

js 的隱式轉換與顯式轉換

隱式轉換 1.undefined與null相等,但不恒等 2.乙個是number乙個是string時,會嘗試將string轉換為number 3.隱式轉換將boolean轉換為number,0或1 4.隱式轉換將object轉換成number或string,取決於另外乙個對比量的型別 5.對於0 空...

顯式型別轉換和隱式型別轉換

typeof六種資料型別 number string boolean undefined object function var num 123 console.log typeof num number var num1 true console.log typeof num1 string va...