explicit的主要用法就是放在單參數的構造函數中,防止隱式轉換, 導致函數的入口參數, 出現歧義.
如果可以使用A構造B, 未加explicit的構造函數, 當使用B進行參數處理時, 就可以使用A, 使得接口混亂.
為了避免這種情況, 使用explicit避免隱式構造, 只能通過顯示(explicit)構造.
下面是代碼, 仔細閱讀必有收獲, 可以試著刪除explicit, 調用注釋的語句.
/*************************************************
File: main.cpp
Copyright: C.L.Wang
Author: C.L.Wang
Date: 2014-04-01
Description: explicit
Email: morndragon@126.com
**************************************************/
/*eclipse cdt, gcc 4.8.1*/
#include <iostream>
using namespace std;
class A {};
class B {
public:
// conversion from A (constructor):
explicit B (const A& x) {
std::cout << "B's constructor" << std::endl;
}
// conversion from A (assignment):
B& operator= (const A& x) {
std::cout << "B's assignment" << std::endl;
return *this;
}
// conversion to A (type-cast operator)
operator A() {
std::cout << "B's conversion" << std::endl;
return A();
}
};
void fn (B arg) {
std::cout << "function" << std::endl;
}
int main ()
{
A foo;
B bar(foo);
//B bar = foo; // calls constructor, 添加explicit出錯, 不能默認構造
//bar = foo; // calls assignment
//foo = bar; // calls type-cast operator
//fn(foo); //添加explicit出錯, 就不能默認的隱式轉換
fn(bar);
return 0;
}
輸出:
B's constructor function
作者:csdn博客 Spike_King