【发布时间】:2012-05-17 14:12:54
【问题描述】:
为什么我不能像这样声明三个成员函数:
void x(int a);
void x(String a);
int x(String a);
?
【问题讨论】:
-
没有愚蠢的问题。
标签: c++ string class function polymorphism
为什么我不能像这样声明三个成员函数:
void x(int a);
void x(String a);
int x(String a);
?
【问题讨论】:
标签: c++ string class function polymorphism
因为你不能通过返回类型重载。
void x(string a)
和
int x(string a)
具有相同的签名。签名由:
在你的情况下,它们是相同的。
【讨论】:
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) 是合法的重载,因为你有不同数量的参数。
【讨论】:
const 和 volatile)已经包含在我的答案中。例如,void x(String const & a) 和 void x(String & a) 是不同的,因为参数类型不同。如果您在谈论成员函数const,那么void x(String a) const,那么这也是参数类型重载的一个特例。末尾的const 表示隐式this 参数(指向类的指针,作为第一个参数隐式传递给函数)是MyClass const * this 而不是MyClass * this。
bind 的成员函数。如果您尝试将int 绑定到函数的第一个参数,您将收到一条非常长且令人困惑的编译器错误消息。我将进行编辑以强调这一点。