【问题标题】:Why can't a class member function take more than one argument of the same type as its class为什么类成员函数不能接受多个与其类相同类型的参数
【发布时间】:2013-06-01 12:36:16
【问题描述】:

前几天,当我尝试使用类成员函数重载一个双参数运算符时遇到了麻烦。我尝试了引用,但没有任何改变。编译器说我不能编写一个成员函数,它接受多个与类本身相同类型的参数。这是为什么呢?

代码如下:

class Fraction
{
public:
  Fraction(int num=1, int den=1): numerator(num), denominator(den) {}
  Fraction(const Fraction& r): numerator(r.numerator), denominator(r.denominator) {}
  Fraction& operator=(const Fraction&);
  Fraction& operator*(const Fraction&, const Fraction&);
private:
  int numerator, denominator;
};

Fraction& Fraction::operator=(const Fraction& r)
{
  numerator = r.numerator;
  denominator = r.denominator;
  return *this;
}

Fraction Fraction::operator*(const Fraction& x, const Fraction& y)
{
  Fraction z(x.numerator*y.numerator, x.denominator*y.denominator);
  return z;
}

以下是编译器的错误信息:

Fraction& Fraction::operator*(const Fraction&, const Fraction&)' must take either zero or one argument

【问题讨论】:

  • 你应该用一些小代码示例来说明这一点。听起来您误解了编译器错误。
  • 请给我们一些代码,以及编译器给你的确切错误:)
  • 可以的。发布代码和错误消息。
  • @juanchopanza 不,我没有!
  • “编译器说我不能编写一个成员函数,它接受多个与类本身相同类型的参数。”不,它没有,它说你不能用多个参数写operator*

标签: c++ class function arguments member-functions


【解决方案1】:

首先,您观察到的问题通常与成员函数完全无关。成员函数通常可以采用任意数量的“同一类”类型的参数。在您的示例中,您可以声明

class Fraction
{
   void foo(Fraction &f1, Fraction &f2, Fraction &f3, Fraction &f4) {}
   ...
};

没有任何问题。因此,尚不清楚您为什么决定将问题表述为与一般成员函数有关。

其次,在您的代码中,实际上是关于您试图重载 运算符 的简单事实。 C++ 中的运算符语法对于大多数(但不是全部)运算符都是固定的。这立即意味着那些语法固定的运算符将具有固定数量的参数。

在您的示例中,它是运算符*。它可以是一元(一个参数)或二元(两个参数)。当您通过成员函数重载此运算符时,已经隐含了一个参数,因此您只能添加零个或一个附加参数(分别为一元 * 和二元 *)。另一方面,您正试图在隐式参数的基础上再添加 两个 参数。 IE。您正在尝试定义 三元 运算符*。这不可能。 C++ 中没有三元 * 运算符。这正是编译器告诉你的。

【讨论】:

  • 谢谢安德烈。你帮了大忙。
  • 一元乘法运算符有什么作用?类似于赋值运算符?
  • @Mohammad Sanei:一元 * 运算符是 dereference 运算符。您将一元 * 应用于指针以访问指向的对象。
【解决方案2】:

运算符采用固定数量的参数,例如 operator+ 因为加法运算符正好采用 2 个参数。如果它是成员函数,则第一个(最左边)隐含为 this,第二个作为参数传递。

调用带有三个参数的 operator+ 会是什么样子?人们可能会想象它看起来像 3 + 4 + 5 但这相当于调用 operator+(3,4) 然后调用 operator+(7,5)。

有关运算符列表及其参数数量,请查看维基百科:http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

有关更多详细信息,还有另一个 StackOverflow 帖子非常详细:Operator overloading

【讨论】:

  • 我认为他的参数数量错误,如果我错了或误解了,对不起。
  • 感谢您的信息,但我想知道的是为什么我不能声明一个类成员函数,该函数接受多个与类具有相同类型的参数
  • @MohammadSanei 你可以。但是乘法operator* 是个例外,因为它总共需要2 个参数,包括隐式的第一个参数。
  • * 是一个二元运算符,这意味着它需要两个(并且只有两个)参数。当它被定义为类成员函数时,左侧参数隐式为*this,因此它只需要一个参数。此外,您在实现中返回对临时对象的引用,这是未定义的行为
  • 谢谢 juanchopanza 和 Charles Salvia。
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2020-07-18
相关资源
最近更新 更多