![]() |
1
21
Scott Meyers主张非成员函数经常改进封装: Herb Sutter和Jim Hyslop在“自给自足的标题”中也谈到了这一点(引用了Meyer的文章)。 这些想法已在 3rd edition of Meyer's "Effective C++" ,“第23项:首选非成员非友元函数而不是成员函数”,以及 Sutter/Alexandrescu's "C++ Coding Standards" “44-更喜欢编写非成员非朋友函数”。 我认为很多开发人员认为这是不直观的,可能有点争议。 |
![]() |
2
20
Herb Sutter和Andrei Alexandrescu建议: 避免会员费:在可能的情况下,更喜欢让非会员的功能成为非朋友。 非成员非朋友函数:
现在,回答你的问题( 什么时候? ,这里有一个算法来确定函数是否应该是成员和/或朋友: If the function is one of the operators =, ->, [], or (), which must be members: => Make it a member Else if: a) the function needs a different type as its left-hand argument (as do stream operators, for example); or b) it needs type conversions on its leftmost argument; or c) it can be implemented using the class's public interface alone: => Make it a nonmember (and friend if needed in cases a) and b) ) If it needs to behave virtually: => Add a virtual member function to provide the virtual behavior, and implement the nonmember in terms of that Else: => Make it a member 参考文献:
|
![]() |
3
13
好啊
你的伙伴是正确的,因为如果通用方法不是类的一部分,那么它们更容易构建(例如,为什么std::find不是std::vector的成员?因为这样它就不适用于列表、地图等)。 您也是正确的,因为过多的暴露会破坏封装。 当你进入现实世界,开始编写应用程序,并在截止日期前完成工作时,你会发现每个应用程序都是一组相互竞争的需求。”我们需要把A、B和C调进来,但要到下个月底。这是不可能的,他们可以有B&C或A&C,但不能有A&B。或者他们可以有A&B的不理想版本和C的良好版本”。 编写代码并没有什么不同,有许多法律和规则定义了理想的封装、通用性、内聚性等级别,但其中许多都是矛盾的,而且您花费了大量的时间试图满足所有这些级别,却什么也没做。 我一直说,这些原则和“法律”实际上只是指导方针,尽你所能地遵循它们,找到你自己的水平,让它们与你相处得很好。…预计这些水平每6个月左右就会改变:) 希望这有帮助。 |
![]() |
4
12
你自己回答问题。如果全局函数只能使用类的光滑、流线型和无浮动的公共接口来操作,那么它们应该是全局的。如果类已经变形以使这些函数成为可能,那么它就不是那么好了。 |
![]() |
5
5
一种方法是:
然而,这并不意味着在所有情况下都要完全遵循这些准则是一个好主意。还有其他的考虑。例如,正如其他人所引用的那样,非成员职能经常与大众的信仰背道而驰 增加 封装。(当然,如果他们通过私有数据的getter/setter来处理对象的状态,那就更值得怀疑了。事实上,我发现getter/setter无论如何都有问题。见 this excellent article 关于这个话题。) |
![]() |
6
3
除了已经提到的文章外,我认为值得从专家那里引用一些额外的意见:
|
![]() |
7
1
你的同事是对的。
所以,它应该是其他更高级别类的成员函数,比如
|
![]() |
8
1
虽然我同意这里的大多数其他答案,即在可能的情况下应该使用自由函数,但硬币的另一面也需要注意:实用程序员的观点。如果我不熟悉代码库,那么如果将给定类型的行为公开为成员函数,那么该行为的可发现性将无限高。思考 智能感知 . 你不能用免费的功能得到它。 |
![]() |
9
0
所以你是说一根绳子不应该有
我不同意。对我来说,拥有额外的特性会给这个类增加更多的服务,如果它们不破坏理解的容易性,这通常是好的——在一般情况下,不一定如此。 |
![]() |
10
-1
做出某个成员或非成员的决定的一部分还与复杂性和管理复杂性有关。 例如,如果有20个或更少的函数需要与一个类关联,那么为什么不让它们成为所有成员函数呢? 但是,当数字达到100或几百时,将这些函数组织成组并创建一个伪类通常会有所帮助,该伪类存储另一个类的实例变量,或者作为对另一个类进行操作的类/静态函数的持有者。 例如,可能有一个文档对象,但有一个对其进行操作并包含编辑功能的编辑器类,而不是文档上的所有编辑功能。 没有硬性或快速的规则——只有原则,如封装、管理复杂性、减少依赖性。其中一些涉及权衡,必须在应用它们的问题的背景下进行分析。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |