1

可能重复:
按返回类型重载

为什么我不能像这样声明三个成员函数:

  void x(int a);
  void x(String a); 
  int x(String a);

?

4

2 回答 2

7

因为你不能通过返回类型重载。

void x(string a)

int x(string a)

有相同的签名。签名由以下部分组成:

  • 函数名
  • 参数
  • cv 限定词

在您的情况下,它们是相同的。

于 2012-05-17T14:14:07.347 回答
3

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)是一个合法的过载,因为你有不同数量的参数。

于 2012-05-17T14:14:27.190 回答