我可以操作class+class(例如我可以做date+date),但是谁能解释一下我怎么做class+class+class?C++ 不允许我定义具有 2 个参数的运算符。
5 回答
那是因为一般没有这样的算子。
a + b + c
是(a + b) + c
。首先a + b
,然后将结果添加到c
。
编辑:
如果有问题的对象非常大,以至于在表达式中创建临时a + b + c
对象太昂贵,您可以谷歌搜索模板表达式;基本思想是operator+
除了返回一个表达式节点之外什么都不做,稍后可以对其进行评估,作为完整表达式的一部分。
通过使它们成为类的朋友,您将确保它们是二元运算符,并分别定义它们,如下所示:
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);) 和该类的其他函数,但这种方法一直对我有用,我在大学时就是这样教的。
有两种方法可以解决这个问题。使用运算符的正常方法是,您只需创建一个普通的两个操作数运算符,然后将调用链接在一起。例如a + b + c + d
=> operator+(operator+(operator+(a + b), c), d)
。
或者,创建您自己的命名函数或提供多参数版本的成员,使用名称准确描述其功能。
我建议阅读http://www.cs.rit.edu/~mjh/docs/c++-faq/operator-overloading.html
据我了解,您在这里不需要 2 个参数。您的重载需要返回一个对象,该对象是您的操作结果。在这种情况下,您的示例 class+class+class 实际上可以写为 class+(class+class) 以便首先处理 (class+class) 然后将其结果添加到第三个类。
您可以使用带有两个参数的算术运算符。例如:
//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/)
注意:如果您需要在其中使用类的私有成员,则需要在类定义中将运算符“函数”声明为友元。
如果然后返回与作为参数给出的类类型相同的类类型(对象或它们的引用,如here),则可以执行class + class + class ...,假设每个operator +调用都在2个参数之间,并添加结果到第三个再次调用运算符+“函数”等。