如何用a + b + c等多个参数重载运算符?

时间:2013-08-13 14:57:30

标签: c++ operator-overloading

我可以操作class + class(例如我可以做日期+日期),但任何人都可以解释我怎样才能上课+课+课? C ++不允许我用2个参数定义运算符。

5 个答案:

答案 0 :(得分:6)

那是因为一般没有这样的操作员 a + b + c(a + b) + c。首先是a + b,然后是结果 其中添加了c

编辑:

如果有问题的对象非常大,那么创建 像a + b + c这样的表达式中的临时表也是如此 贵,你可以google模板表达;基础的 我的想法是operator+除了返回之外什么都不做 表达式节点,可以在以后进行评估,作为其中的一部分 完整的表达。

答案 1 :(得分:1)

通过让他们成为班级的朋友,你会确保他们是二元运算符,并分别定义它们,如下所示:

class someclass
{
     int a;
public:
     someclass();
     ...
     friend someclass operator+(const someclass & lhs, const someclass & rhs);
};

someclass operator+(const someclass &lhs, const someclass &rhs)
{
     someclass a = lhs;
     a.a = a.a + rhs.a;
     return a;
}

你当然需要定义一个拷贝构造函数(someclass(const someclass& old);)以及该类的其他函数,但是这个方法对我来说一直很有用,这就是我的教学方式学院。

答案 2 :(得分:0)

有两种方法可以解决这个问题。运算符的常规方法是,您只需创建一个普通的两个操作数运算符,然后将调用链接在一起。例如a + b + c + d => operator+(operator+(operator+(a + b), c), d)

或者,创建您自己的命名函数或提供多参数版本的成员,使用该名称准确描述它的作用。

答案 3 :(得分:0)

我建议阅读http://www.cs.rit.edu/~mjh/docs/c++-faq/operator-overloading.html

据我所知,此处不需要2个参数。您的重载需要返回一个操作结果的对象。在这种情况下,您的示例类+ class + class实际上可以写为class +(class + class),以便首先处理(class + class),然后将结果添加到第三个类中。

答案 4 :(得分:0)

您可以使用具有两个参数的算术运算符。例如:

//References are used here as arguments.
Cents operator+(const Cents &c1, const Cents &c2)
{
    // use the Cents constructor and operator+(int, int)
    return Cents(c1.m_nCents + c2.m_nCents);
}

(资料来源:http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/

注意:如果您需要在其中使用类的私有成员,则需要在类定义中将运算符“function”声明为 friend

如果你然后返回一个类型与那些作为参数给出的类型(这里的对象或引用),你可以做class + class + class ...,假设每个operator +调用都在2个参数之间,并且结果被添加到第三个,再次调用operator +“function”等。