1. 程式人生 > >C++中的explicit關鍵字介紹

C++中的explicit關鍵字介紹

C++中的關鍵字explicit主要是用來修飾類的建構函式,被修飾的建構函式的類,不能發生相應的隱式型別轉換,只能以顯示的方式進行型別轉換。類建構函式預設情況下宣告為隱式的即implicit。

 隱式轉換即是可以由單個實參來呼叫的建構函式定義了一個從形參型別到該類型別的隱式轉換。編譯器在試圖編譯某一條語句時,如果某一函式的引數型別不匹配,編譯器就會嘗試進行隱式轉換,如果隱式轉換後能正確編譯,編譯器就會繼續執行編譯過程,否則報錯。

         explicit關鍵字只能用於類內部的建構函式宣告上,而不能用在類外部的函式定義(函式實現)上,它的作用是不能進行隱式轉換;explicit關鍵字作用於單個引數的建構函式,如果建構函式有多個引數,但是從第二個引數開始,如果各引數均有預設賦值,也可以應用explicit關鍵字。

         當建構函式只有一個引數時,會進行自動隱式轉換,當建構函式引數個數超過或等於兩個時自動取消隱式轉換,當只有一個必須輸入的引數,其餘的為有預設值的引數時使用explicit也起作用。

         一般只將有單個引數的建構函式宣告為explicit,而拷貝建構函式不要宣告為explicit。

         explicit關鍵字只能對使用者自己定義的物件起作用,不對預設建構函式起作用。此關鍵只能夠修飾建構函式。無引數的建構函式和多引數的建構函式總是顯示呼叫,這種情況在建構函式前加explicit無意義。

         當不希望進行自動型別轉換時用explicit,標準庫的許多建構函式都是explicit的。

以下是參考網上的一個測試程式碼:

explicit.hpp:

#ifndef FBC_MESSY_TEST_EXPLICIT_HPP
#define FBC_MESSY_TEST_EXPLICIT_HPP
 
// reference Bjarne Stroustrup sample
class String{
public:
    explicit String(int n) {};
    String(const char *p) {};
};
 
void test_explicit();
 
#endif // FBC_MESSY_TEST_EXPLICIT_HPP
explicit.cpp:
#include <explicit.hpp>
 
static void test1()
{
    String s1 = 'a'; // 錯誤:不能做隱式char->String轉換
    String s2(10); // 可以:呼叫explicit String(int n);
    String s3 = String(10); // 可以:呼叫explicit String(int n);再呼叫預設的複製建構函式
    String s4 = "Brian"; // 可以:隱式轉換呼叫String(const char *p);再呼叫預設的複製建構函式
    String s5("Fawlty"); // 可以:正常呼叫String(const char *p);
}
 
static void f(String)
{
 
}
 
static String g()
{
    f(10); // 錯誤:不能做隱式int->String轉換
    f("Arthur"); // 可以:隱式轉換,等價於f(String("Arthur"));
    return 10; // 同上
}
 
void test_explicit()
{
    test1();
    g();
}
--------------------- 
作者:fengbingchun 
來源:CSDN 
原文:https://blog.csdn.net/fengbingchun/article/details/51168728 
版權宣告:本文為博主原創文章,轉載請附上博文連結!