【发布时间】:2011-04-23 05:35:06
【问题描述】:
这个问题的答案似乎让我无法理解,但是如何使用非成员函数进行重载。您是否只是创建一个程序级函数,而无论原型(或定义)存在于何处,该类类型的运算符都会被重载?
【问题讨论】:
标签: c++ operator-overloading non-member-functions
这个问题的答案似乎让我无法理解,但是如何使用非成员函数进行重载。您是否只是创建一个程序级函数,而无论原型(或定义)存在于何处,该类类型的运算符都会被重载?
【问题讨论】:
标签: c++ operator-overloading non-member-functions
对于成员函数,this 将是左侧参数,这意味着您的运算符将只有一个参数(或者对于一元运算符没有参数)。对于独立函数,您必须分别为二元或一元运算符提供两个或一个参数。
一个很好的例子是<< 流操作符:
class T;
// ...
std::ostream & operator<<(std::ostream &os, const T &val)
{
// ...
return os;
}
这里,os 是左侧参数,val 是右侧参数。
至于“where”,操作符必须定义在你使用的地方。通常,将它们放在与您要为其重载运算符的类型相同的位置。
编辑:
对于非平凡的运算符(基本类型的算术运算),运算符是函数调用的语法糖。当你这样做时:
std::cout << "Hello";
就像这样写:
operator<<(std::cout, "Hello");
但更具可读性。
对于成员运算符,左侧参数将是this(这就是成员运算符少一个参数的原因)。
【讨论】:
operator<<。 std::ostream & 是返回类型。但最终的区别在于,一个是方法(因此有一个this 指针),而另一个不是。
std::ostream 是所有输出流的基类。 std::cout 是 std::ostream。