想要理解顯示轉換,首先得明白與之對應得隱式轉換是什麼。
隱式轉換關鍵字是implicit, 意思是隱藏的,類建構函式預設情況下即宣告為implicit(隱式),且不顯示出來,因此常常被我們所忽略。下面詳細講解隱式轉換得過程
假如乙個類a的建構函式是a(int i),
則在變數宣告的時候,既用a a(1);,
又可以使用隱式轉換a a=1;這一步中間省略的操作為a temp(1); a a=temp;
因此1可以通過建構函式a(int i)轉換為乙個類a的物件。(隱含的型別轉換操作符)
具體過程見如下**所示
//cxstring 隱式建構函式
class
cxstring
cxstring
(const
char
* p)};
cxstring string1(24
);// 這樣是ok的, 為cxstring預分配24位元組的大小的記憶體
//編譯會有乙個隱式轉換:將該建構函式對應資料型別的資料轉換為該類物件.
//cxstring temp(10);
//cxstring string2 = temp;
// 所以這樣是ok的, 為cxstring預分配10位元組的大小的記憶體
cxstring string2 =
10;
cxstring string3;
// 這樣是不行的, 因為沒有預設建構函式, 錯誤為: 「cxstring」: 沒有合適的預設建構函式可用
cxstring string4
("aaaa");
// 這樣是ok的
cxstring string5 =
"bbb"
;// 這樣也是ok的,
cxstring string6 =
'c';
// 這樣也是ok的, 其實呼叫的是cxstring(int size), 且size等於'c'的ascii碼
string1 =2;
// 這樣也是ok的, 為cxstring預分配2位元組的大小的記憶體
string2 =3;
// 這樣也是ok的, 為cxstring預分配3位元組的大小的記憶體
string3 = string1;
// 這樣也是ok的, 至少編譯是沒問題的, 但是如果析構函式裡用free釋放_pstr記憶體指標的時候可能會報錯, 完整的**必須過載運算子"=", 並在其中處理記憶體釋放
上述**中,cxstring string6 = 『c』; 其實就是隱式轉換所帶來的弊端,使得物件宣告的時候開闢了錯誤大小的初始空間。c++為我們簡化操作,獲得方便得同時,也會出現一些與之對應問題。而因為這個問題引入explicit,顯示變換。
c++中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式, 它的作用是表明該建構函式是顯示的
//cxstring 顯示建構函式
class
cxstring2
cxstring2
(const
char
* p)};
//顯示建構函式不會進行隱式轉換 顧這樣寫是錯誤的
cxstring2 string7 =10;
//只能這樣進行初始化
cxstring2 string8(10
);string8 =10;
//這樣寫也不行,因為已經不允許進行隱式變換
explicit關鍵字的作用就是防止類建構函式的隱式自動轉換. C 轉換關鍵字
implicit為隱式的轉換 explicit為顯示的轉換 通過這種方法可以有效地驗證資料,對引數進行處理。不管是否實用,在此先記錄下來 以後回顧用 class 轉換關鍵字 set public myage private myage int32 age 整型到myage 的隱式轉換 public ...
C 隱式轉換關鍵字 implicit
implicit關鍵字用於宣告隱式的使用者定義型別轉換運算子。如果可以確保轉換過程不會造成資料丟失,則可使用該關鍵字在使用者定義型別和其他型別之間進行隱式轉換。引用摘自 implicit c 參考 仍以student求和舉例 class student 數學成績 public double math...
C 顯式轉換關鍵字 explicit
不同於隱式轉換,顯式轉換運算子必須通過轉換的方式來呼叫。如果轉換操作會導致異常或丟失資訊,則應將其標記為explicit。這可阻止編譯器靜默呼叫可能產生意外後果的轉換操作。省略轉換將導致編譯時錯誤 cs0266。該引用摘自 explicit c 參考 顯示轉換關鍵字explicit能向閱讀 的每個人...