如果具有相同名稱的函數在具有不同簽名的多個文件中定義,那麼這些函數是否被重載,例如:重載函數
File1.cpp
int foo(){//do something}
File2.cpp
int foo(int a){//do something}
如果我編譯在同一個項目中這兩個文件,將這些功能被視爲重載函數。
如果具有相同名稱的函數在具有不同簽名的多個文件中定義,那麼這些函數是否被重載,例如:重載函數
File1.cpp
int foo(){//do something}
File2.cpp
int foo(int a){//do something}
如果我編譯在同一個項目中這兩個文件,將這些功能被視爲重載函數。
是的,他們將appropiately name-mangled成兩個單獨的功能,其scope是全球性的,在全局命名空間(a.k.a:在::
命名空間)。
對於兩個函數被重載,並且不違反ODR,它們的參數類型和「屬性」(參數列表之後,如const
,volatile
,或noexcept
)應是不同的。兩個函數具有相同的一組參數類型和「屬性」,但具有不同的返回類型,這違反了ODR。
只是不用擔心這一點,並讓鏈接器成爲它誕生的編譯器的奴隸。
是的,它們是兩種不同的功能。
函數簽名主要基於參數:參數個數,類型和順序。類成員函數也有修飾符,如const
或不。返回類型是不是部分簽名來區分重載函數。
如果兩個具有相同名稱的函數具有唯一的簽名,則它們是不同的。