|
1
4
这就是为什么流操作符必须是朋友的根本原因。 获取此代码:
考虑调用的上下文
…如果找不到,则在全局命名空间中查找:
…如果找不到,就无法编译。 但是,当您尝试将流插入运算符作为gizmo的成员实现时,您希望编译器将您的代码解析为:
…除非您将代码更改为:
……这显然不是你想要的。 |
|
2
9
这不是任何运算符必须
顺便说一句,完全不要求声明为单独函数的运算符声明为
|
|
|
3
6
因为第一个表单重载
|
|
|
4
3
当你在做的时候
所以你必须编写一个函数来启用它,一种方法是重载
现在你要么交朋友要么不交。如果你不让它成为朋友,你就必须提供getter函数(比如
如前所述,您所做的将导致代码被编写为
|
|
|
5
3
当作为成员函数实现时,运算符重载有一个隐式的第一个参数 这 . 对于溪流来说,这是不正常的:溪流必须先来。 使用friend运算符简短,可以防止意外的隐式转换(由于仅通过adl使用)。如果您想定义它(例如在一个implementation.cpp文件中),那么让它调用一个非公共的并且可能是虚拟的方法:
加分: 将不具有的运算符重载成员命名为 这 . (提示:它们是静态的。) |
|
|
6
0
Scott Meyers在《有效C++第二版》中的总结 项目19:区分成员函数、非成员函数和友元函数 : operator和operator从来不是成员。如果f是operator>gt;或operator<<,则使f成为非成员函数。此外,如果F需要接触C的非公开成员,请让F成为C的朋友 此声明只是决定是否成为operator<<和operator>>成员的一个准则。最好让他们成为非会员。如果你愿意,你可以让他们成为会员,但如果你愿意,你将被迫写:
实际上,可以通过更改对STD::CUT到上面的表单的调用来纠正第一段代码。但这种写作方式绝对不自然。 关于操作人员(作为非成员)的友好关系,如果任何一个操作人员需要访问私有/受保护的数据成员(如您的情况),那么它必须是类外部的朋友。 |
|
|
Noah Wilder · Swift中元组的操作符重载 8 年前 |
|
|
Salman · 指向具有数组索引运算符重载的类的指针 8 年前 |
|
|
Nom OnTheCookie · 使用向量重载C++输出 8 年前 |
|
|
J. Doe · C++重载:从友元函数切换到成员函数 8 年前 |
|
|
Ana · 使用操作符重载添加存储在vector中的类对象 8 年前 |
|
|
Matthew · 重载运算符|用于固定大小的阵列? 8 年前 |
|
|
Martin Žid · 重载运算符+=具有两个类 8 年前 |