程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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++編程說話中有許多比擬主要的症結字在現實編程中起著異常主要的感化。我們明天為年夜家引見的C++ explicit症結字就是個中一個運用比擬頻仍的症結字。上面就讓我們一路來看看這方面的常識吧。

C++ explicit症結字用來潤飾類的結構函數,注解該結構函數是顯式的,既然有"顯式"那末必定就有"隱式",那末甚麼是顯示而甚麼又是隱式的呢?

假如c++類的結構函數有一個參數,那末在編譯的時刻就會有一個缺省的轉換操作:將該結構函數對應數據類型的數據轉換為該類對象,以下面所示:

class MyClass
{
public:
 MyClass(int num)
 {
  number=num;
 }

private:
 int number;
};
//.
MyClass obj=10; //ok, convert int to MyClass

在下面的代碼中編譯器主動將整型轉換為MyClass類對象,現實上同等於上面的操作:

MyClass temp(10);
MyClass obj = temp;

下面的一切的C++ explicit症結字相干的操作等於所謂的"隱式轉換"。

假如要防止這類主動轉換的功效,我們該怎樣做呢?嘿嘿這就是症結字explicit的感化了,將類的結構函數聲明為"顯式",也就是在聲明結構函數的時刻後面添加上explicit便可,如許便可以避免這類主動的轉換操作,假如我們修正下面的MyClass類的結構函數為顯式的,那末上面的代碼就不克不及夠編譯經由過程了,以下所示:

class MyClass
  {  public:


          explicit MyClass( int num );
  } 


//. 
MyClass obj = 10;
 //err,can't non-explict convert

以上就是對C++ explicit症結字的相干引見。

依照默許劃定,只要一個參數的結構函數也界說了一個隱式轉換,將該結構函數對應數據類型的數據轉換為該類對象,以下面所示:

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