我必须将数据设为私有吗?

时间:2013-04-13 04:37:20

标签: c++ coding-style private public

我知道类中的数据应该是私有的,然后使用getter和setter来读取/修改它们。但与直接使用保存成员函数的student.scores.push_back(100)相比,这不是很麻烦。

class Student {
public:

    void addToScores(int inScore) {

        scores.push_back(inScore);
    }

private:

    vector<int> scores;
}

总之,我很好奇人们在实践中实际做了什么,总是严格私密的数据与吸气剂和二传手?

4 个答案:

答案 0 :(得分:4)

成员函数的目的是公开接口。没有必要使getter和setter或其他简单的函数简单地将已经由成员实现的接口移动到聚合容器对象。

如果Student的客户应该被允许操纵scores但他们想要,你应该让scores成为公共成员,并以简单的方式访问它。如果它应该是仅包含pushpoptop的堆栈,则使用std::stack接口适配器。如果只允许push_back,那么您可以实施addToScores。但如果唯一的客户就是你,并且你并不担心std::vector接口的其他部分被滥用,那么实现新接口真的没有意义。

程序中的每个界面都应该经过精心设计。添加slapdash接口是一种习惯,因为标准接口(包括C ++默认赋值运算符)是“危险的”并不一定是个好习惯。

答案 1 :(得分:2)

在实践中,人们使用类来定义具有独立于其数据成员的新语义的新数据类型。既不使用访问器也不使用公共数据成员,而是提供成员函数来执行与新数据类型相关的任务,同时维护数据成员的不变量。

当然,有时候人们会编写只是数据聚合的类,没有额外的语义。在这种情况下,填充公共成员的struct是合适的。

答案 2 :(得分:2)

使用Get / Set方法的一个基本原因是控制除数据封装之外的输入类型。

如果您不想采用某些特定的输入类型,假设您可能不希望得分超出[0,100]间隔的范围,则可以在Set方法中检查此条件,以便库用户无法创建不合逻辑的操作。

答案 3 :(得分:0)

如果是简单的读/写,您实际上不必将数据设为私有。但是,如果您需要对正在读/写的数据进行验证/条件,那么将其设置为私有是有意义的。