一个快速的c ++查询

时间:2012-05-17 14:12:55

标签: c++ string class function polymorphism

  

可能重复:
  Overloading by return type

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

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

2 个答案:

答案 0 :(得分:7)

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

void x(string a)

int x(string a)

具有相同的签名。签名由以下内容组成:

  • 功能名称
  • 参数
  • cv修饰符

在您的情况下,这是相同的。

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