引言
本文介紹了 C++ 中
explicit
關鍵字的用法.
原文位址: C++ explicit 用法
歡迎通路我的部落格: http://blog.duhbb.com/
explicit 作用
在 C++中,
explicit
關鍵字用來修飾類的構造函數, 被修飾的構造函數的類, 不能發生相應的隐式類型轉換, 隻能以顯式的方式進行類型轉換.
explicit
使用注意事項:
-
關鍵字隻能用于類内部的構造函數聲明上.explicit
-
關鍵字作用于單個參數的構造函數 (多個參數也适用, 但必須隻有一個參數需要指派, 其他的參數有預設值).explicit
- 在 C++ 中,
關鍵字用來修飾類的構造函數, 被修飾的構造函數的類, 不能發生相應的隐式類型轉換.explicit
- it cannot be used for
andimplicit conversions
copy-initialization
多個參數的情況
其實對于上面的第二點我是存疑的, 因為 CPP Reference explicit specifier 中的例子表明
explicit
是可以用于多個參數的.
例子
例 1 基礎例子
#include <bits/stdc++.h>
using namespace std;
class Test1 {
public:
Test1(int n) {
m_num = n;
}
private:
int m_num;
};
class Test2 {
public:
explicit Test2(int n) {
m_num = n;
}
private:
int m_num;
};
int main() {
Test1 t1 = 12; // 隐式調用構造函數成功
Test2 t2 = 12; // 編譯錯誤, 不能隐式調用其構造函數
Test2 t2(12); // 顯式調用成功
return 0;
}
例 2 CPP Reference 中的例子
下面是 CPP Reference explicit specifier 中的例子, 感覺更全面一點:
struct A
{
A(int) { } // converting constructor
A(int, int) { } // converting constructor (C++11)
operator bool() const { return true; }
};
struct B
{
explicit B(int) { }
explicit B(int, int) { }
explicit operator bool() const { return true; }
};
int main()
{
A a1 = 1; // OK: copy-initialization selects A::A(int)
A a2(2); // OK: direct-initialization selects A::A(int)
A a3 {4, 5}; // OK: direct-list-initialization selects A::A(int, int)
A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int)
A a5 = (A)1; // OK: explicit cast performs static_cast
if (a1) ; // OK: A::operator bool()
bool na1 = a1; // OK: copy-initialization selects A::operator bool()
bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization
// B b1 = 1; // error: copy-initialization does not consider B::B(int)
B b2(2); // OK: direct-initialization selects B::B(int)
B b3 {4, 5}; // OK: direct-list-initialization selects B::B(int, int)
// B b4 = {4, 5}; // error: copy-list-initialization does not consider B::B(int,int)
B b5 = (B)1; // OK: explicit cast performs static_cast
if (b2) ; // OK: B::operator bool()
// bool nb1 = b2; // error: copy-initialization does not consider B::operator bool()
bool nb2 = static_cast<bool>(b2); // OK: static_cast performs direct-initialization
}