![]() |
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到上面的表单的调用来纠正第一段代码。但这种写作方式绝对不自然。 关于操作人员(作为非成员)的友好关系,如果任何一个操作人员需要访问私有/受保护的数据成员(如您的情况),那么它必须是类外部的朋友。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |