C 中的explicit關鍵字

2021-07-06 10:27:02 字數 1689 閱讀 7244

在c++程式中很少有人去使用explicit關鍵字,不可否認,在平時的實踐中確實很少能用的上。再說c++的功能強大,往往乙個問題可以利用好幾種c++特性去解決。但稍微留心一下就會發現現有的mfc庫或者c++標準庫中的相關類宣告中explicit出現的頻率是很高的。了解explicit關鍵字的功能及其使用對於我們閱讀使用庫是很有幫助的,而且在編寫自己的**時也可以嘗試使用。既然c++語言提供這種特性,我想在有些時候這種特性將會非常有用。

按預設規定,只用傳乙個引數的建構函式也定義了乙個隱式轉換。舉個例子:

(下面這個cexample沒有什麼實際的意義,主要是用來說明問題)

#pragma once

class cexample

;#include "stdafx.h"

#include "example.h"

cexample::cexample(void)

: m_ifirst(0)

cexample::~cexample(void)

cexample::cexample(int ifirst, int isecond):m_ifirst(ifirst), m_isecond(isecond)

...//其它標頭檔案

#include "example.h"

int _tmain(int argc, _tchar* argv)

如果在建構函式宣告中加入關鍵字explicit,如下

explicit cexample(int ifirst, int isecond = 4);

那麼cexample objfour = 12; 這條語句將不能通過編譯。在vs05下的編譯錯誤提示如下

error c2440: 'initializing' : cannot convert from 'int' to 'cexample'

constructor for class 'cexample' is declared 'explicit'

對於某些型別,這一情況非常理想。但在大部分情況中,隱式轉換卻容易導致錯誤(不是語法錯誤,編譯器不會報錯)。隱式轉換總是在我們沒有察覺的情況下悄悄發生,除非有心所為,隱式轉換常常是我們所不希望發生的。通過將建構函式宣告為explicit(顯式)的方式可以抑制隱式轉換。也就是說,explicit建構函式必須顯式呼叫。

引用一下bjarne stroustrup的例子:

class string;

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);

void f(string);

string g()

在實際**中的東西可不像這種故意造出的例子。

發生隱式轉換,除非有心利用,隱式轉換常常帶來程式邏輯的錯誤,而且這種錯誤一旦發生是很難察覺的。

原則上應該在所有的建構函式前加explicit關鍵字,當你有心利用隱式轉換的時候再去解除explicit,這樣可以大大減少錯誤的發生。

c 中explicit關鍵字

c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的。既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 include using namesp...

c 中的explicit關鍵字

c 中的explicit關鍵字 c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下...

c 中的explicit關鍵字

c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 class myclas...