我们可以将赋值运算符作为普通函数重载,但是我们不能将赋值运算符作为友元函数重载。为什么呢?
答案 0 :(得分:4)
因为C ++标准这样说,第13.5.3 / 1条:
任务操作员应为 由非静态成员实现 只有一个参数的函数。 因为是复制赋值运算符 operator =隐式声明为a 如果没有用户声明的类 (12.8),基类赋值 操作符始终由副本隐藏 派生的赋值运算符 类。
这就是你真正需要知道的。友元函数不是成员函数,因此不能用于重载赋值运算符。
答案 1 :(得分:0)
如果你想写:
MyClassObject = MyFriendObject;
然后你想要实现一个构造函数,它将const引用作为它的参数。
答案 2 :(得分:0)
按朋友函数重载与按成员函数重载之间的区别在于调用对象必须是按成员函数重载的第一个操作数,虽然按朋友功能重载没有限制。这就是标准背后的原因。类似地,需要第一个操作数作为调用函数的其他一些操作符必须使用成员函数重载(例如:=, [], ->,
和( )
)。
答案 3 :(得分:0)
你不能在课堂外用“自由函数”“扩展”赋值运算符,但你可以设计类,以便允许它:
Data.h
class Data {
public:
Data& operator=(const Data& lhs) { /*...*/; return *this; }
template <typename T> Data& operator=(const T& lhs) {
return assign(*this, lhs); // Magic right here...
}
private:
// ...
};
Point.h
class Point {
public:
float x,y;
Point& operator=(const Point& lhs) { x = lhs.x, y = lhs.y; return *this; }
template <typename T> Point& operator=(const T& lhs) {
return assign(*this, lhs); // Magic right here...
}
};
Assignment.h
Data& assign(const Data& lhs, const Point& rhs) {
lhs["x"] = rhs.x;
lhs["y"] = rhs.y;
return lhs;
}
Point& assign(const Point& lhs, const Data& rhs) {
rhs.query("x", lhs.x) || rhs.query(0, lhs.x);
rhs.query("y", lhs.y) || rhs.query(1, lhs.y);
return lhs;
}