簡體   English   中英

函數重載如何在運行時工作,以及為什么重載?

[英]How does function overloading work at run-time, and why overload?

假設我有一個名為ClothingStore的課程。 該類有3個成員函數,指向訪問者到商店的正確部門。 會員職能是ChildrenDept,MenDept和WomenDept,取決於訪客是兒童,男性還是女性。

函數重載可以用來創建3個具有相同名稱的函數,比如PointToDept,但是使用不同的輸入參數(child,man,woman)。

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

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

我的猜測是編譯器將switch語句添加到程序中,以選擇正確的成員函數。

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

函數重載如何在運行時工作

它沒有。 它在編譯時工作。 調用重載函數在運行時與調用非重載函數沒有什么不同。

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

是。 與“使用switch語句創建自己的函數”相比,根本沒有運行時開銷。

來自Gene的評論:

編譯器看到三個不同的函數,就好像它們的命名方式不同。

在大多數編譯器的情況下,它們的名稱不同。 這曾經被稱為名稱修改 ,其中函數名稱以返回類型為前綴,后綴為參數類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM