26 July 2022

C++ 核心指南目录

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 指针的函数