c++中explicit關鍵字用法

C++ explicit關鍵字用來修飾類的構造函數,代表該構造函數是顯式的,既然有"顯式"那麼必然就有"隱式",那麼什麼是顯示而什麼又是隱式的呢?c++

若是c++類的構造函數有一個參數,那麼在編譯的時候就會有一個缺省的轉換操做:將該構造函數對應數據類型的數據轉換爲該類對象,以下面所示:函數

 1 #include "stdafx.h"
 2 
 3 class A
 4 {
 5 public:
 6     A(int n) {m = n;}
 7 private:
 8     int m;
 9 };
10 
11 int _tmain(int argc, _TCHAR* argv[])
12 {
13     A a = 10;
14     return 0;
15 }

在上面的代碼中編譯器自動將整型轉換爲A類對象,實際上等同於下面的操做:spa

#include "stdafx.h"

class A
{
public:
    A(int n) {m = n;}
private:
    int m;
};

int _tmain(int argc, _TCHAR* argv[])
{
    A temp(10);
    A a = temp;
    return 0;
}

上面的操做便是所謂的"隱式轉換"。code

若是要避免這種自動轉換的功能,咱們該怎麼作呢?這就是關鍵字explicit的做用了,將類的構造函數聲明爲"顯式",也就是在聲明構造函數的時候前面添加上explicit便可,這樣就能夠防止這種自動的轉換操做,若是咱們修改上面的A類的構造函數爲顯式的,那麼下面的代碼就不可以編譯經過了,以下所示:對象

#include "stdafx.h"

class A
{
public:
    explicit A(int n) {m = n;}
private:
    int m;
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a = 10;
    return 0;
}

error C2440: 'initializing' : cannot convert from 'int' to 'A'  blog

Constructor for class 'A' is declared 'explicit'ci

相關文章
相關標籤/搜索