2010-02-21 88 views
1

我在問C++中函數的靜態綁定。函數綁定的數據類型轉換規則是什麼?函數在C++中的靜態綁定

假設我們有

void func(int x); 
void func(long x); 
void func(float x); 
void func(double x); 
void func(char x); 

,我在主

func(1) 

我知道函數func(INT x)的一個函數將被調用。我很好奇這個規則。

它總是最好的搭配?

聲明的順序是否重要?

在任何情況下,數據類型轉換將被應用?

規則設計時的關注點是什麼?

+0

重載解析規則在C++中是一個複雜的主題。例如,嘗試刪除'char'重載,並傳遞一個'char'。被調用的函數是'int'版本。如果你刪除了'int'函數並仍然通過'char',那麼調用將是不明確的。我認爲你真正掌握這些規則的唯一方法就是閱讀標準。 –

回答

5

它總是最好的搭配嗎?

是:1int。如果存在適當的過載,將會採取,因爲這可以最小化必要的隱式轉換(無)的次數。

聲明的順序是否重要?

不。但是,重要的是是否在調用之前已聲明瞭一個函數。如果該函數在調用之後聲明爲,則不會考慮重載解析。

在任何情況下,數據類型轉換將應用?

這裏沒有轉換,因爲int完全匹配。只有在沒有完全匹配的情況下,轉換纔會發揮作用。

規則設計時的關注點是什麼?

嗯,這是唯一有道理的規則,不是嗎?

4

常數1有型號int所以最好的匹配是void func(int)。聲明的順序不影響。類型轉換將在有最佳匹配時發揮作用(不含歧義),但匹配和參數與參數的類型不同。

1

有類型的常量,例如1u用於unsigned 1以及1l用於long 1和相同的雙(1.0)和浮子(1.0f)。

+0

也許另外:對於'unsigned long long 1',還有一個不變的後綴'1ull'。在代碼中看起來很有趣。 –

+0

所以你的意思是,常量沒有類型轉換? – skydoor

+0

每個常量都有一個特定的類型。可能存在隱式轉換。所以如果你做double a = 0.1f;有一個從float到double的隱式轉換。大多數情況下,編譯器都會優化它(在編譯時進行轉換)。但是,只有在需要轉換時纔會這樣做。在你的例子中,它不是必需的,因此它也不會發生,即使不是偶然的;)。 – ypnos

2

在C++中它總是最佳匹配。聲明的順序無關緊要。 是的,常量具有類型轉換。例如,如果你寫的另一個重載:

void func(std::string const& x); 

然後調用:

func("Hi there"); 

然後編譯器將使用func(std::string const& x)過載爲std::string包含構造以char const *並用其作爲的類型轉換規則之一。然後臨時std :: string將被構造並傳遞給func。