C++ explicit結構函數實例解析。本站提示廣大學習愛好者:(C++ explicit結構函數實例解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ explicit結構函數實例解析正文
依照C說話默許劃定,只要一個參數的結構函數也界說了一個隱式轉換,將該結構函數對應數據類型的數據轉換為該類對象,以下面所示:
class String { String ( const char* p ); // 用C作風的字符串p作為初始化值 //… } String s1 = "hello"; //OK 隱式轉換,等價於String s1 = String("hello");
然則有的時刻能夠會不須要這類隱式轉換,以下:
class String { String ( int n ); //本意是事後分派n個字節給字符串 String ( const char* p ); // 用C作風的字符串p作為初始化值 //… }
上面兩種寫法比擬正常:
String s2 ( 10 ); //OK 分派10個字節的空字符串 String s3 = String ( 10 ); //OK 分派10個字節的空字符串
上面兩種寫法就比擬困惑了:
String s4 = 10; //編譯經由過程,也是分派10個字節的空字符串 String s5 = 'a'; //編譯經由過程,分派int('a')個字節的空字符串
s4 和s5 分離把一個int型和char型,隱式轉換成了分派若干字節的空字符串,輕易使人誤會。
為了不這類毛病的產生,我們可以聲顯著示的轉換,應用explicit 症結字:
class String { explicit String ( int n ); //本意是事後分派n個字節給字符串 String ( const char* p ); // 用C作風的字符串p作為初始化值 //… }
加上explicit,就克制了String ( int n )的隱式轉換,
上面兩種寫法依然准確:
String s2 ( 10 ); //OK 分派10個字節的空字符串 String s3 = String ( 10 ); //OK 分派10個字節的空字符串
上面兩種寫法就不許可了:
String s4 = 10; //編譯欠亨過,不許可隱式的轉換 String s5 = 'a'; //編譯欠亨過,不許可隱式的轉換
是以,某些時刻,explicit 可以有用得避免結構函數的隱式轉換帶來的毛病或許誤會
explicit只對結構函數起感化,用來克制隱式轉換。如:
class A{ A(int a); }; int Function(A a);
當挪用 Function(2) 的時刻,2 會隱式轉換為 A 類型。這類情形經常不是法式員想要的成果,所以,要防止之,便可以如許寫:
class A { explicit A(int a); }; int Function(A a);
如許,當挪用Function(2)的時刻,編譯器會給失足誤信息(除非Function有個以int為參數的重載情勢),這就防止了在法式員絕不知情的情形下湧現毛病。
總結:explicit只對結構函數起感化,用來克制隱式轉換。