在C++中,這樣的行爲將是一場災難。如果我理解正確,Java會嘗試通過搜索A
中的第一個成員,即B
類型或隱式轉換爲B
來將A
類型的對象轉換爲B
類型的對象。
C++沒有這樣設計。我們喜歡編寫代碼,這總是可以預測的。你可以達到你想要的,但是對於一個價格。
在這種情況下,最好的解決辦法是轉換操作符 - 考慮:
class Program
{
public:
int id;
char *str;
operator int()
{
return this->id;
}
//You can have more than one!
operator const char*()
{
return this->str;
}
};
void function_int(int p)
{
}
void function_str(const char* s)
{
}
現在可以做到以下幾點:
Program prog;
function_int(prog); //Equivalent of function_int(prog.id)
function_str(prog); //Equivalent of function_int(prog.str)
的價格是,如果添加另一個int
並將其放在id
之前,它不會用於轉換,因爲我們在我們的操作員明確指出,我們班級的「int
內容」由id
代表,此成員是c當涉及到這樣的轉換時,我們會有所考慮。
但是,即使這個簡單的例子也顯示了一些潛在的問題 - 用整數和指針類型重載函數可能會導致非常不可預測的行爲。當type包含轉換運算符時,指針和整數都會變得更糟。
假設,我們有如下功能:
void func(unsigned long)
{
}
我們稱之爲func
與Program
類型的參數。您希望調用哪個轉換運算符?編譯器知道如何將Program
轉換爲int
或const char*
,但不是unsigned long
。 This article on cppreference應該可以幫助您瞭解隱式轉換的工作方式。
另外,正如Barry指出的,更無意義的結構變得可用。考慮一下:
int x = prog + 2
這是什麼意思?不過,這是完全有效的代碼。這就是轉換運營商應該非常小心的原因(在C++ 11之前的時代,有一個普遍的建議,每個類最多隻能有一個這樣的運營商)。從MSDN
引用:
如果需要轉換引起歧義,則產生一個錯誤。如果有多個用戶定義的轉換可用或存在用戶定義的轉換和內置轉換,則會產生歧義。
有時候,簡單的解決這個問題是標記轉換運營商,明確關鍵字,所以你需要以上更改來電:
function_int((int)prog);
function_str((const char*)prog);
而不是像以前的形式一樣漂亮,但更安全。這基本上意味着,編譯器被禁止使用標記爲顯式的運算符執行任何隱式轉換。對於避免模糊調用非常有用,但仍然在代碼中提供了一些靈活性 - 您仍然可以非常輕鬆地將一種類型的對象轉換爲另一種類型的對象,但是您可以確定執行這些轉換的時間和位置。
但是,某些編譯器仍然不支持顯式轉換運算符,因爲這是C++ 11功能(例如,Visual C++ 11不支持它)。
您可以閱讀更多關於明確關鍵字here。
Java的'toString()'如何在不調用任何方法的情況下工作? – juanchopanza 2015-04-04 13:25:48
數組的名稱*不等於指針。 – chris 2015-04-04 13:25:48
@juanchopanza,我想如果你傳遞了一個字符串的地方,它隱式調用'.toString()'。 – chris 2015-04-04 13:26:32