【问题标题】:A quick c++ query [duplicate]一个快速的 C++ 查询 [重复]
【发布时间】:2012-05-17 14:12:54
【问题描述】:

可能重复:
Overloading by return type

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

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

?

【问题讨论】:

  • 没有愚蠢的问题。

标签: c++ string class function polymorphism


【解决方案1】:

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

void x(string a)

int x(string a)

具有相同的签名。签名由:

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

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

【讨论】:

  • 哦,我明白了!非常感谢您的解释。
【解决方案2】:

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) 是不同的,因为世界可以判断您是否修改a .将const 放在函数末尾是另一个过载机会来源。最后,也是最明显的,void x(int a)void x(int a, int b) 是合法的重载,因为你有不同数量的参数。

【讨论】:

  • cv-qualifiers(constvolatile)已经包含在我的答案中。例如,void x(String const & a)void x(String & a) 是不同的,因为参数类型不同。如果您在谈论成员函数const,那么void x(String a) const,那么这也是参数类型重载的一个特例。末尾的const 表示隐式this 参数(指向类的指针,作为第一个参数隐式传递给函数)是MyClass const * this 而不是MyClass * this
  • 应用于函数的 cv 限定符修改函数签名。事实上,它将 this 转换为 const 指针是一个实现细节。
  • 我同意你的观点,但是初学者(显然是 OP)可能觉得它不太清楚,所以在实际答案中指出它可能会很有帮助。
  • 实际上它改变了函数的使用方式。例如,尝试使用bind 的成员函数。如果您尝试将int 绑定到函数的第一个参数,您将收到一条非常长且令人困惑的编译器错误消息。我将进行编辑以强调这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 2013-08-31
  • 2016-12-12
  • 2013-09-20
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多