程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ explicit結構函數實例解析

C++ explicit結構函數實例解析

編輯:關於C++

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只對結構函數起感化,用來克制隱式轉換。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved