为什么我不能声明这样的三个成员函数:
void x(int a);
void x(String a);
int x(String a);
答案 0 :(得分:7)
因为你不能通过返回类型重载。
void x(string a)
和
int x(string a)
具有相同的签名。签名由以下内容组成:
在您的情况下,这是相同的。
答案 1 :(得分:3)
C ++不允许您根据返回类型重载函数。仅允许基于参数的类型进行函数重载。这意味着,就重载规则而言,void x(String a)
和int x(String a)
被视为相同的功能。
可能令人困惑(但经常使用)的一个重要案例是const
放在成员函数的末尾。这看起来像int number_of_peanuts(bool tasty_only) const
。最后const
表示此成员函数所属的类不能被此函数修改。
但是,这实际上只是参数类型重载的一个特例。当你有一个未声明为static
的成员函数时,会隐式地为你的函数添加一个额外的参数,即this
指针。这意味着我给出的示例函数大致相当于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)
是不同的,因为世界可以分辨如果您修改或不。将const
放在函数末尾是另一个过载机会的来源。最后,最明显的是,void x(int a)
和void x(int a, int b)
是合法的重载,因为你有不同数量的参数。