操作员在课外超载
这个问题在这里已经有了答案:
基本问题是“您是否希望在操作员的左侧参数上执行转换?” 。 如果是,请使用免费功能。 如果不是,请使用班级成员。
例如,对于字符串operator+()
,我们希望执行转换,以便我们可以这样说:
string a = "bar";
string b = "foo" + a;
执行转换以将char * "foo"
转换为std::string
。 所以,我们让字符串的operator+()
变成一个自由函数。
首先:两种不同的方式真的是“作为成员重载”和“作为非成员重载”,后者有两种不同的编写方式(作为朋友内部类定义和外部类定义)。 称他们为“内部课堂”和“课外课堂”会让你感到困惑。
重载+ =,+, - =, - 等有一个特殊的模式:
struct Vector2 {
float x, y;
Vector2& operator+=(Vector2 const& other) {
x += other.x;
y += other.y;
return *this;
}
Vector2& operator-=(Vector2 const& other) {
x -= other.x;
y -= other.y;
return *this;
}
};
Vector2 operator+(Vector2 a, Vector2 const& b) {
// note 'a' is passed by value and thus copied
a += b;
return a;
}
Vector2 operator-(Vector2 a, Vector2 const& b) { return a -= b; } // compact
该模式允许在LHS参数的其他答案中提到的转换,同时大大简化了实现。 (无论是成员还是非成员都可以在RHS作为const&
或按值传递时进行转换)当然,这只适用于确实要重载+ =和+, - =和 - 等等,但这仍然很常见。
另外,有时候你想使用Barton-Nackman技巧在类定义中声明你的非成员op +等作为朋友,因为由于模板和重载的怪癖,它可能不会被发现。
在Meyer的Effective C ++中有一个很好的关于这个问题的讨论:第24项是“当类型转换应用于所有参数时声明非成员函数”,而第46项是“在需要类型转换时定义模板内部的非成员函数”。
链接地址: http://www.djcxy.com/p/12693.html上一篇: Operator overloading outside class
下一篇: What does it mean to have an undefined reference to a static member?