2011-03-01 127 views
0

我们可以将赋值运算符重载为正常函数,但我们不能将赋值运算符重载为友元函数。为什么?重载赋值运算符

回答

4

由于C++标准是这样说的,第13.5.3/1:

赋值运算符应 由非静态成员 函数正好与一个参数实现。 由于复制赋值运算符 运算符=是隐式声明要 类,如果不能由用户 (12.8),基站类别指派 操作者总是由派生类 的拷贝 赋值运算符隐藏声明。

这就是你真正需要知道的。朋友函数不是成员函数,因此它不能用于重载赋值运算符。

0

如果你想写:

MyClassObject = MyFriendObject;

然后,你会想要实现一个构造函数,它接受一个友元类的const引用作为它的参数。

0

由朋友功能和由成员函数重载重载之间的差异是调用对象必须在重载由成员函数第一个操作数,而存在由朋友功能重载没有限制。这是标准背后的原因。同样,需要第一个操作数作为调用函数的一些其他操作符必须使用成员函数(例如:=, [], ->,())进行重载。

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; 
}