C++ C++;重载+;运算符导致错误
我已尝试为我的类重载“+”运算符:C++ C++;重载+;运算符导致错误,c++,C++,我已尝试为我的类重载“+”运算符: Vector operator+( const Vector& a, const Vector& b ); 然而,它告诉我: vector.h(12): error C2804: binary 'operator +' has too many parameters 我真的不明白。请帮助我如果在类中定义运算符,它应该只接收1个参数 class Vector { ... Vector operator+ (const Vector&a
Vector operator+( const Vector& a, const Vector& b );
然而,它告诉我:
vector.h(12): error C2804: binary 'operator +' has too many parameters
我真的不明白。请帮助我如果在类中定义运算符,它应该只接收1个参数
class Vector {
...
Vector operator+ (const Vector& other) const {
Vector res = *this;
res += other;
return res;
}
...
};
如果在类定义之外定义2参数,则使用2参数版本
class Vector {
...
};
Vector operator+ (const Vector& first, const Vector& second) {
Vector res = first;
res += second;
return res;
}
我猜您是将代码放在类中,如果是这样,您只需要给出一个参数(另一个对象),因为默认情况下,
这个
对象位于左侧 我相信您已将其声明为类Vector
的成员方法。在这种情况下,它应该只接受一个参数,因为调用此运算符的对象可以通过此
指针隐式使用。或者,您可以将函数声明为类Vector
的友元,并为其获取两个参数。这是因为运算符左侧的向量和右侧的向量不是第一个和第二个参数。+
前面的一个实际上是这个
,它是作为向量*
自动提供的。您只需要一个参数,即+
运算符右侧的向量
这是正确的:
Vector operator+( const Vector& b );
您可以通过以下方式访问左向量:
(* this)
b
。。。右向量是:
(* this)
b
重载+运算符时,只能有一个参数。
另一个参数是“this”跟随KennyTM,或者让您成为朋友
像
友元向量操作符+(常量向量&a,常量向量&b)代码>
可以找到一个例子。具体的错误已经在一些答案中得到了回答。成员方法为单参数,自由函数版本为两个参数。但是没有提示您应该遵循什么路径:您应该删除第一个参数还是让它成为一个自由函数
常见的习惯用法是,如果您提供operator+
,您可能还希望提供operator+=
,如果您同时提供这两个,您可以根据后者实现第一个。将operator+=
作为成员函数(完全访问所有状态)实施,将operator+
作为自由函数实施,只需使用公共operator+=
:
class MyClass {
public:
MyClass& operator+=( MyClass const & rhs );
};
MyClass operator+( MyClass lhs, MyClass const & rhs ) {
return lhs+=rhs;
}
这样,您的操作只有一个实现,您可以同时提供两个接口(a+b
或a+=b
),因此您的接口更加丰富,几乎不需要任何成本。对于第二种情况,如果不是手动复制第一个参数,而是使用“按值传递”,则如果第一个参数是临时参数,编译器有机会优化复制。在向量运算符+(向量第一,向量常数和第二);向量foo()。。。a=foo()+b代码>编译器知道foo()
调用的结果是要销毁的临时绑定,因此它可以对代码进行排列,以便将其构建在运算符+
的第一个参数的位置,并删除副本。使用您建议的签名,编译器无法避免复制对象。创建自由函数的原因是什么?通常将操作符+
声明为类方法不是更好吗?@sje397:自由函数操作符相对于数据类型是对称的,而成员方法不能是对称的。考虑可以从类型<代码> T2隐式转换的类型<代码> >代码>,以及从这些类型中两个对象<代码>代码>代码>代码> > T2<代码>。如果T
有一个成员方法operator+
,则T+t2
格式正确,将调用该运算符,但t2+T
将是编译时错误。在自由函数实现中,这两个操作都是允许的,并且具有完全相同的含义——这是人们从加法中假定的……编译器在调用T
的成员方法之前,不允许将t2
转换为T
,但是允许执行该转换以匹配函数/方法的参数,如t+t2
@sje397所示。干净的代码意味着简短的类定义试图遵循单一责任原则(一个类应该做很少的事情,但是做得很好)。如果将代数运算符的定义添加到类向量中会导致类定义变长,那么。。。然后您应该将其声明为非成员函数。@sje397 cf第44章。“在Bjarne Stroustrup的C++中,在深度系列中C++编写代码标准更喜欢编写非成员非好友函数:101个规则,指南,以及HEB和StutTrice的最佳实践,您的操作员是一个类的成员函数?如果是,请在问题中添加类别声明。