CppCoreGuidelines C.4 成员函数直接访问类的内部数据
26 July 2022
C.4: 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++ 语言要求虚函数( virtual )必须是成员函数。然而,并非所有虚函数都直接访问对象数据。抽象类的成员函数,很少会去访问成员变量。
例外
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
指针的函数