C++:const公共成员有什么问题?

Mak*_*ake 6 c++

我正在阅读一些代码,其中一个类具有私有const数据成员,然后是一大堆公共方法,它们提供对这些数据成员的只读访问.

这有什么意义?为什么不公开这些私人数据成员?它们是const,所以访问按照定义只读,人们可以通过theClass.theMember而不是theClass.getTheMember()更容易访问它们,而且你可以避免首先创建所有这些公共方法.每个成员变量一个,意味着O(n)效率低下!

cma*_*ter 8

除非访问器方法实际上除了提供引用之外还其他事情,否则它们确实是多余的。

例如,这可以是:

  • Setter:检查给定的值是否实际有效。

  • Getter:从其他东西动态获取请求的值。

  • Setter:确保给定的值与其他数据成员一致。

  • Setter:将更改通知一些数据使用者

  • ...

但是,如果您正在编写类似的东西

private:
    const int _foo;

public:
    const int& foo() const { return _foo; }
Run Code Online (Sandbox Code Playgroud)

没有写作优势

public:
    const int foo;
Run Code Online (Sandbox Code Playgroud)

反而。你不能对后者做任何你不能对前者做的事情。

同样,代码

private:
    int _foo;

public:
    int& foo() { return _foo; }
    const int& foo() const { return _foo; }
Run Code Online (Sandbox Code Playgroud)

不提供任何好处

public:
    int foo;
Run Code Online (Sandbox Code Playgroud)

因为任何用户都可以设置_foo他们喜欢的任何值,而对象甚至不会注意到它。


所以,我的建议是:

  • 默认情况下将数据成员声明为私有。

  • 如果您需要只读访问但数据成员是可变的,请提供一个 getter。

  • 如果数据成员是const可读的,请使用public: const

  • 如果要允许用户在任何时间提供任何值,请继续使成员 public。老实说:类本身无法控制成员的价值,无论如何。

    请注意,这种情况也极少发生。在绝大多数情况下,您希望您的类提供一些抽象,这意味着它不仅仅是一堆公共数据成员。一个编写良好的类应该实现一些所需的行为,而不仅仅是数据的集合。此外,如果该类只有一堆公共数据成员,您会将其声明为 a struct,不是吗?

  • 如果你发现你需要班级做某事在访问公共变量时,请将其转换为私有变量,提供相关访问器,并让您的编译器将您指向代码中需要更新的所有位置。

    这种情况也很少发生,但它会迫使您在更改其访问行为之前实际查看数据成员的所有用途。这可能是一件好事,因为它使您有机会在更改的行为出现在测试和/或生产中之前发现问题。如果您已经为变量提供了 vanilla 访问器,您将不会被迫重新访问调用站点。


Pet*_*lev 3

嗯,这只是风格。对于您的具体示例,将它们声明为公开可能是有意义的。

然而,提供 get 和 set 方法是一种惯例,这些方法可能会也可能不会对字段执行额外的操作。
考虑一下需求是否有变化或者其他什么。

而且,对于刚接触代码的程序员来说可能更方便。
他们中的大多数人都有通过 getter 进行访问的概念,因此他们期望代码是这样的。