1. 程式人生 > >C++ 中 explicit 關鍵字的作用(轉載) 2012-10-10 14:35

C++ 中 explicit 關鍵字的作用(轉載) 2012-10-10 14:35

在 C++ 中, 如果一個類有隻有一個引數的建構函式,C++ 允許一種特殊的宣告類變數的方式。在這種情況下,可以直接將一個對應於建構函式引數型別的資料直接賦值給類變數,編譯器在編譯時會自動進行型別轉換,將對應於建構函式引數型別的資料轉換為類的物件。 如果在建構函式前加上 explicit 修飾詞, 則會禁止這種自動轉換,在這種情況下, 即使將對應於建構函式引數型別的資料直接賦值給類變數,編譯器也會報錯。

下面以具體例項來說明。

建立people.cpp 檔案,然後輸入下列內容:

/*人類,是人的類,不是人類 -:) */

class People

{

public:

int age;

explicit People (int a)

{

age=a;

}

};

/*三種方式來 “造人” */

void foo ( void )

{

People p1(10); //方式一

People* p_p2=new People(10); //方式二

People p3=10; //方式三

}

這段 C++ 程式定義了一個類 people ,包含一個建構函式, 這個建構函式只包含一個整形引數 a ,可用於在構造類時初始化 age 變數。

然後定義了一個函式foo,在這個函式中我們用三種方式分別建立了三個10歲的“人”。 第一種是最一般的類變數宣告方式。第二種方式其實是聲明瞭一個people類的指標變數,然後在堆中動態建立了一個people例項,並把這個例項的地址賦值給了p_p2。第三種方式就是我們所說的特殊方式,為什麼說特殊呢? 我們都知道,C/C++是一種強型別語言,不同的資料型別是不能隨意轉換的,如果要進行型別轉換,必須進行顯式強制型別轉換,而這裡,沒有進行任何顯式的轉換,直接將一個整型資料賦值給了類變數p3。

因此,可以說,這裡進行了一次隱式型別轉換,編譯器自動將對應於建構函式引數型別的資料轉換為了該類的物件,因此方式三經編譯器自動轉換後和方式一最終的實現方式是一樣的。

對於不可隨意進行型別轉換的強型別語言C/C++來說, 這可以說是C++的一個特性。哦,今天好像不是要說C++的特性,而是要知道explicit關鍵字的作用?

explicit關鍵字到底是什麼作用呢? 它的作用就是禁止這個特性。如文章一開始而言,凡是用explicit關鍵字修飾的建構函式,編譯時就不會進行自動轉換,而會報錯。