可能重复:
按返回类型重载
为什么我不能像这样声明三个成员函数:
void x(int a);
void x(String a);
int x(String a);
?
因为你不能通过返回类型重载。
void x(string a)
和
int x(string a)
有相同的签名。签名由以下部分组成:
在您的情况下,它们是相同的。
C++ 不允许您根据返回类型重载函数。仅根据参数的类型允许函数重载。这意味着就重载规则而言,void x(String a)
和int x(String a)
被视为相同的功能。
一种可能令人困惑(但经常使用)的重要情况是将 whenconst
放在成员函数的末尾。那看起来像int number_of_peanuts(bool tasty_only) const
. const
最后意味着这个成员函数所属的类不能被这个函数修改。
然而,这实际上只是参数类型重载的一个特例。当您有一个未声明的成员函数时,您的函数中static
会隐式添加一个额外的参数,即 thisthis
指针。这意味着我给出的示例函数大致相当于int number_of_peanuts(Class const * this, bool tasty_only)
. 如果你在函数的末尾没有const
,那么它会像int number_of_peanuts(Class * this, bool tasty_only)
.
所以总而言之,参数的类型和数量是唯一允许你重载的东西。如果你按值传递,如void x(int a)
,那么const
不会给你超载的机会,因为外界无法分辨你是否修改副本。如果你通过引用传递或传递一个指针,那么你可以使用const
他们所指的东西作为重载选项,所以void x(std::string & a)
和void x(std::string const & a)
不同,因为世界可以判断你是否修改了 a 。放在const
函数的末尾是另一个过载机会的来源。最后,也是最明显的,void x(int a)
andvoid x(int a, int b)
是一个合法的过载,因为你有不同数量的参数。