標記單參數建構函式(或多參數但有預設值)為 explicit,禁止隱式轉換,避免函式呼叫時發生非預期的型別轉換。
/*************************************************
File: main.cpp
Copyright: C.L.Wang
Author: C.L.Wang
Date: 2014-04-01
**************************************************/
#include <iostream>
using namespace std;
class A {};
class B {
public:
explicit B(const A& x) { cout << "B's constructor" << endl; }
B& operator=(const A& x) { cout << "B's assignment" << endl; return *this; }
operator A() { cout << "B's conversion" << endl; return A(); }
};
void fn(B arg) { cout << "function" << endl; }
int main() {
A foo;
B bar(foo); // 顯式建構 OK
// B bar = foo; // 錯誤:隱式建構被 explicit 阻擋
// bar = foo; // OK:賦值運算子非 explicit
// foo = bar; // OK:轉型運算子
// fn(foo); // 錯誤:隱式轉換被阻擋
fn(bar); // OK:顯式傳遞 B
return 0;
}
B's constructor
function
explicit 也可用於轉型運算子(explicit operator bool())。