运算符覆盖 - 何时使用好友
Operator override - when to use friend?
我想知道为什么 () 运算符覆盖不能是"朋友"(因此它需要一个"this"附加参数),而 + 运算符需要是朋友,如以下示例所示:
class fnobj
{
int operator()(int i);
friend int operator+(fnobj& e);
};
int fnobj::operator()(int i)
{
}
int operator+(fnobj& e)
{
}
我知道 + 运算符需要成为朋友以避免"额外"额外的 this 参数,但为什么运算符()不需要它?
您重载了一元加号运算符。 你可能不想那样做。 它不添加两个对象,它描述了当+
出现在它面前时如何解释单个对象,与解释int x = +10
相同。 (解释与int x = 10
相同)
对于加法运算符,"+ 运算符需要是朋友"是不正确的。
以下是添加两个fnobj
对象的两种方法:
int operator+(fnobj& e);
friend int operator+(fnobj& left, fnobj& right);
在第一种形式中,this
被假定为+
左侧的对象。 因此,这两种形式实际上都采用两个参数。
因此,要回答您的问题,与其认为"operator()不需要friend
",不如将其视为"operator()需要this
",或者更好的是,"将对象视为函数需要对象"。
您没有正确理解这一点(也没有正确使用它)。
C++有两种方法可以为类定义二元运算符,一种是作为成员函数
class A
{
public:
int operator+ (A const& other);
};
或作为免费功能
class A {};
int operator+ (A const& lhs, A const& rhs);
您目前混淆的是,您可以在类范围内声明并定义此自由函数为 friend
,这将允许该函数使用该类的私有成员(这通常不适用于自由函数)。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- std::vector的包装器,使数组的结构看起来像结构的数组
- 何时提供默认参数作为模板参数
- 如何在全屏模式下(在OpenGL中)使背景透明
- 找到两对数字,使它们的乘积的绝对差最小化
- C++:如何使函数只返回作为列表一部分的字符串
- 何时使函数成为类成员函数C++?
- 如何使模板化类成为另一个模板化类的好友
- 何时必须使操作员<<过载?
- C++:不能使运算符<<成为模板嵌套类的好友
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- 如何使 lambda 函数成为类的好友
- 选择何时使用好友功能
- 运算符覆盖 - 何时使用好友
- 为什么我不能使这个成员函数成为另一个类的好友?
- Apple C++ LLVM Compiler 4.x & UNICODE:何时需要?UNICODE 是默认编译器字符集吗?使代码同时编译 ANSI 和 UNICODE 版本
- 如何使libcurl c++调用超时和/或知道调用中何时发生超时
- 使方法成为嵌套命名空间中的好友
- 使"class template"成为类好友的正确语法