程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++關鍵字之:explicit相關內容介紹

C++關鍵字之:explicit相關內容介紹

編輯:C++入門知識

C++關鍵字之:explicit相關內容介紹


一、文章來由

c++基礎知識繁多,對於不太常用,易用錯的關鍵字需要總結一下。

二、explicit關鍵字作用

(1)explicit關鍵字只是用來修飾構造函數的,而且它只會出現在類中的構造函數聲明之前(定義之前再出現就錯了)。

(2)explicit關鍵字是用來抑制由構造函數定義的隱式轉換的。

三、構造函數定義的隱式轉換

如下代碼:

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

MyClass obj = 10; //ok,convert int to MyClass

當定義了MyClass類的MyClass(int num);構造函數後,C++就允許最後一行的那種構造方法,這就叫做由構造函數定義的隱式轉換

class MyClass
{
public:
  explicit MyClass( int num );  //add a explicit in front of constructor
}

MyClass obj = 10; //compiler error, implicit convert is not allowed now.
MyClass obj = MyClass(10); //OK, because this is a explicit convert.

當定義了explicit關鍵字後,隱式轉換就會報錯。這時只能使用顯式轉換 。

或者包裝的再復雜一些:

#include 
using namespace std;

class Book
{
public:
    int num;
    Book(int n) {
        num = n;
    }

    Book() {
    }

protected:
private:
};

class Books
{
public:
    Book b;
    Books(Book tmp) {
        b=tmp;
    }
protected:
private:
};

int main() 
{
    Books books(2); //此時可行

    return 0; 
}

其實這裡就是將2隱式轉換成了Book類
但如果,將 Book(int n) 前加 explicit,就不能隱式調用了

四、使用注意

注意 :

explicit關鍵字只需要在類定義中的構造函數聲明語句的頭部書寫,在構造函數的定義處不用寫了。寫了會報錯。

使用的建議 :

如果沒有很合適的理由說明必須使用隱式轉換,而且如果你的構造函數是單形參可調用,那麼最好聲明explicit,這樣可以避免錯誤。當然,多形參調用的構造函數是沒有構造函數的隱式轉換的,所以也沒必要聲明explicit。


   

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