一些類的構造器總是用explicit修飾,這是為什麼呢?它是做什麼用的呢?
我們先看看這個程序:
#include <iostream>
#include <string>
using namespace std;
class MyClass
{
public:
MyClass(string n = "name") : name(n)
{
cout << "construct" << endl;
}
void myFunc(const MyClass &c) const
{
cout << name << endl;
}
private:
string name;
};
int main()
{
MyClass c;
string a = "xiaoming";
c.myFunc(a);
return 0;
}
運行結果:
construct
construct
name
從運行結果可以看到構造函數執行了兩次,分析程序,第一次調用時發生在MyClass c時,那麼第二此時只能是myFunc(a)中,實時上也如此。這裡是發生了隱式類類型轉化。中間把”xiaoming”的string類型傳遞給了myFunc函數,並臨時調用構造器生成一個臨時實例來執行這個myFunc函數。
某些地方我們期待那麼可以這麼用,但是如果我們不想發生隱式轉化(有時候這種轉化會很荒謬),那麼就使用explicit修飾構造器。這就將抑制由構造器定義的隱式轉化。我們加上後,再編譯就會編譯不過。
另外,explicit只需要在類裡聲明,在外部重復聲明將會報錯。
如果我們定義的類有explicit抑制了,我們卻想轉化,只能顯式轉化:c.myFunc(MyClass(a))。