2014-02-07 38 views
4

假設我有一個名爲ClothingStore的類。該課程有3個成員功能,指向訪問商店正確部門的訪問者。會員職能是兒童部門,男子部門和婦女部門,具體取決於訪問者是小孩,男性還是女性。函數重載如何在運行時工作,以及爲什麼會重載?

函數重載可用於使3個函數具有相同的名稱,比如PointToDept,但採用不同的輸入參數(兒童,男人,女人)。

執行程序時在運行時實際發生了什麼?

我的猜測是編譯器將switch語句添加到程序中,以選擇正確的成員函數。但是,這讓我懷疑 - 在使用重載函數時,程序性能方面是否有任何好處,而不是使用switch語句創建自己的函數?同樣,我唯一的結論就是代碼可讀性。謝謝。

+11

編譯器可以看到三個不同的功能就好像他們被不同的名稱。 (編譯器)通過查看參數類型和「模式匹配」以及參數類型在每個調用站點調用哪個函數。沒有switch語句。該調用只是針對具有匹配參數的獨特功能。如果編譯器找不到匹配項(因爲不符合C++重載解析規則),則會收到編譯時錯誤消息。 – Gene

+0

請參閱http:// en。wikipedia.org/wiki/Ad_hoc_polymorphism#Early_binding –

+0

「爲什麼超載?」 - 因爲它允許您編寫客戶端代碼,即使其提供的數據類型發生更改,也不需要將其調用更改爲重載函數。這對於普通的客戶端代碼來說很方便 - 只是在開發或維護編程期間它會演變爲使用另一種類型,但當客戶端說可以從其調用者接受任何類型的模板時,這一點至關重要:如果模板可以調用重載函數使用相同的源代碼,一種形式的多態(重載)乾淨地支持其他(模板)。 –

回答

3

編譯器會看到三個不同的函數,就像它們被命名不同一樣。

在大多數編譯器的情況下,它們被命名不同。這個過去被稱爲「name mangling」,其中函數名稱前綴爲返回類型,後綴爲參數類型。

http://en.wikipedia.org/wiki/Name_mangling

6

我的猜測是編譯器向程序中添加了switch語句來選擇正確的成員函數。

這是一個糟糕的猜測。 C++是一種靜態類型語言。運行時變量的類型不會更改。這意味着決定調用哪個非多態重載是始終可以在編譯時進行的。標準章節13.3,過載分辨率,確保情況如此。當編譯時做出決定時,沒有理由做出運行時決定。在大多數實現中具有非多態重載函數的運行時成本爲零。唯一的例外可能是C++解釋器。

3

如何在運行時

函數重載工作沒有。它在編譯時工作。對於重載函數的調用在運行時從調用到非重載函數是沒有區別的。

爲什麼超載? ...在使用重載函數時,程序性能方面是否有任何好處,而不是使用switch語句創建自己的函數?

是的。與「用switch語句創建自己的函數」相比,沒有任何運行時開銷。

相關問題