为什么 C++ 中如此频繁地使用 get/set 函数?

sam*_*ius 2 c++ oop class object

这样做的意义何在:

class thing {
    
public:
    void setMarbles(int _marbles){marbles = _marbles;}
    void getMarbles(){return marbles;}
    
private:
    int marbles;
};
Run Code Online (Sandbox Code Playgroud)

当你可以这样做时:

class thing {
    
public:
    int marbles;

};
Run Code Online (Sandbox Code Playgroud)

我觉得这是一个非常常见的问题,但我在任何地方都找不到答案。我唯一的理论是,如果在新版本的类中更改了 ov 变量的顺序,则使用旧类的程序将切换变量。这是正确的理由吗?

Jef*_*ica 5

封装性、可维护性、可调试性

考虑:

void thing::setMarbles(int _marbles)
{
    // runtime error if incorrectly used
    assert(_marbles > 0);
    marbles = _marbles;
}

void thing::setMarbles(int _marbles)
{
    // log to some file to debug some specific scenario
    someLogUtility("Marbles write", _marbles);    
    marbles = _marbles;
}
Run Code Online (Sandbox Code Playgroud)

thing您将来可能还想改变:

private:
char marbles; // support less marbles
Run Code Online (Sandbox Code Playgroud)

或者

private:
long marbles; // support more marbles
Run Code Online (Sandbox Code Playgroud)

然后,您可以在不破坏外部用户代码的情况下保留您的设置器。

这是一个非常好的实践,但是需要在实际项目中进行一些操作才能看到全部价值。简而言之:公共领域永远束缚着你的手脚。二传手留下了灵活性。

另外,正如评论中所建议的:

void thing::setMarbles(int _marbles)
{
    // setting a breakpoint on next line is possible and lets you easily find where/when marbles is modified.
    marbles = _marbles;
}
Run Code Online (Sandbox Code Playgroud)