← 模式

非成员非友元接口

12345678910111213141516171819202122232425namespace ns { class foo { public: void member() { // 使用私有数据 } private: // 私有数据 }; void non_member(foo obj) { obj.member(); } } int main() { ns::foo obj; non_member(obj); }

此模式采用 CC0 公共领域贡献 许可。

要求 c++98 或更新版本。

意图

减少对类内部细节的依赖,并改善封装性。

描述

第 3-13 行定义的 foo 类只有一个成员函数 member第 6-9 行),该函数需要访问 foo 的私有数据。

第 15-18 行的函数 non_member 在逻辑上也属于 foo 接口的一部分,但它被定义为非成员函数,因为它可以通过 member 函数来实现。这种方法通过减少依赖于类私有成员的函数数量来改善封装性

第 24 行,实参依赖查找 (Argument-Dependent Lookup, ADL) 允许我们调用 non_member 而无需使用 ns 命名空间进行限定。ADL 规则规定,函数名将在其参数所属的命名空间中进行查找。由于我们传递了一个 ns::foo 类型的对象给 non_member,因此在 ns 命名空间中找到了该函数。

贡献者

  • Joseph Mansfield

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享