CppCoreGuidelines C.4 成员函数直接访问类的内部数据
26 July 2022
“Make a function a member only if it needs direct access to the representation of a class”
理由
非成员函数比成员函数耦合度更低。修改对象内部状态的函数越少越好。对象内部实现变化了,需要修改的地方也越少。
例子
class Date { // ... relatively small interface ... }; // helper functions: Date next_weekday(Date); bool operator==(Date, Date);
“帮助函数”不需要访问 Date 的内部实现。
注意
等到 C++ 支持函数的统一调用格式的时候,这里描述的规则,会变得更恰当合适。
例外
C++ 语言要求虚函数必须是成员函数。然而,并非所有虚函数都直接访问对象数据。尤其是抽象类的虚函数,很少会去访问成员变量。
例外
C++ 语言要求以下操作符为成员函数: =
, ()
, []
, ->
例外
重载的一组成员函数,不一定都会访问私有数据。比如:
class Foobar { public: void foo(long x) { /* manipulate private data */ } void foo(double x) { foo(std::lround(x)); } // ... private: // ... };
例外
同样的,有时候为了统一方便,一组函数链在一起使用:
x.scale(0.5).rotate(45).set_color(Color::red);
有些函数不一定访问私有数据。
强化
- 找到非虚函数,但是却不会直接触碰到私有数据。
- 忽略虚函数
- 忽略一组重载的函数,其中之一会访问私有数据
- 忽略返回
this
指针的函数