guo*_*guo 52 c++ encapsulation stl
从http://www.cplusplus.com/reference/utility/pair/,我们知道std::pair有两个成员变量,first和second.
为什么STL设计者决定公开两个成员变量,first而second不是提供a getFirst()和a getSecond()?
Che*_*Alf 94
对于原始的C++ 03 std::pair,访问成员的函数没有任何用处.
从C++ 11及更高版本开始(我们现在在C++ 14,C++ 17快速出现)std::pair是一个特例std::tuple,std::tuple可以有任意数量的项目.因此,有一个参数化的getter是有意义的,因为发明和标准化任意数量的项名称是不切实际的.因此,你可以使用std::get同样的std::pair.
因此,设计的原因是历史性的,即当前std::pair是向更一般性演变的最终结果.
在其他新闻中:
关于
"据我所知,如果将两个成员变量封装在上面并给出一个
getFirst();和更好的话会更好getSecond()
不,那是垃圾.
这就像说锤子总是更好,无论你是用钉子钉,用螺钉固定,还是修剪一块木头.特别是在最后一种情况下,锤子不是一种有用的工具.锤子可能非常有用,但这并不意味着它们总体上"更好":这只是胡说八道.
Som*_*ken 29
如果认为获取或设置值需要额外的逻辑(改变某些内部状态),则getter和setter通常很有用.然后可以将其轻松添加到方法中.在这种情况下std::pair,仅用于提供2个数据值.没有更多,没有更少.因此,添加吸气剂和设定器的详细程度将毫无意义.
Ili*_*llo 13
原因是不需要对数据结构施加真正的不变量,因为std::pair模型是两个元素的通用容器.换言之,类型的对象std::pair<T, U>被假定为有效的任何可能的first和second类型的元件T和U分别.同样,其元素价值的后续突变也不能真正影响std::pair本身的有效性.
Alex Stepanov(STL的作者)在评论容器(即一个元素的容器)时,在他的" 使用组件进行高效编程"课程中明确地介绍了这个一般设计原则. singleton
因此,尽管原则本身可以成为争论的源泉,但这也是形成原因的原因std::pair.
如果人们认为抽象是保证用户免于设计选择和现在或将来的那些选择的变化,那么Getters和setter是有用的.
"现在"的典型示例是setter/getter可能具有验证和/或计算值的逻辑 - 例如,使用setter作为电话号码,而不是直接暴露字段,以便您可以检查格式; 对集合使用getter,以便getter可以向调用者提供成员值(集合)的只读视图.
"未来的变化" 的规范(虽然不好)的例子是Point- 你应该公开x和y或getX()和getY()?通常的答案是使用getter/setter,因为在将来的某个时候,您可能希望将内部表示 从笛卡尔更改为极地,并且您不希望您的用户受到影响(或让他们依赖于该设计决策) .
在这种情况下std::pair- 意图是这个类现在并且永远直接表示两个且恰好两个值(任意类型),并根据需要提供它们的值.而已.这就是为什么设计使用直接成员访问,而不是通过getter/setter.
可以说,std::pair拥有访问者功能以访问其成员会更好!特别是对于退化的情况,std::pair可能有一个优势.例如,当至少一个类型是空的非final类时,对象可以更小(空基可以成为不需要获得其自己的地址的基础).
当时std::pair发明了这些特殊情况没有被考虑(我不确定当时的工作文件草案中是否允许空基础优化).从语义角度来看,没有太多理由拥有访问器功能:显然,访问者需要为非const对象返回可变引用.结果,访问器不提供任何形式的封装.
另一方面,它使得优化器[稍微]难以看到当使用访问器函数时发生了什么,例如因为引入了额外的序列点.我可以想象孟李和亚历山大斯捷潘诺夫甚至衡量是否存在差异(我也没有).即使他们没有,直接提供对成员的访问肯定不比通过访问器功能慢,而反过来不一定是真的.
我不是决策的一部分,C++标准不具有合理性,但我想这是一个深思熟虑的决定,使成员公共数据成员.
| 归档时间: |
|
| 查看次数: |
4321 次 |
| 最近记录: |