← 模式
非成员非友元接口
12345678910111213141516171819202122232425 | namespace 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
命名空间中找到了该函数。