我必须让数据保密吗?
Do I have to make data private?
我知道类中的数据应该是私有的,然后使用getter和setter来读取/修改它们。但是比起直接使用student.scores.push_back(100)
,节省了一个成员函数,是不是很麻烦。
class Student {
public:
void addToScores(int inScore) {
scores.push_back(inScore);
}
private:
vector<int> scores;
}
简而言之,我很好奇人们实际上是怎么做的,总是严格私有的数据与getter和setter?
成员函数的目的是公开一个接口。不需要创建getter和setter或其他琐碎的函数,只需将成员已经实现的接口移动到聚合容器对象中。
如果允许Student
的客户端任意操作scores
,则应该使scores
成为公共成员并以简单的方式访问它。如果它应该是一个只有push
、pop
和top
的堆栈,那么使用std::stack
接口适配器。如果只允许push_back
,那么可以实现addToScores
。但是,如果唯一的客户端是您,并且您不担心std::vector
接口的其他部分被滥用,那么实现新接口确实没有意义。
程序中的每个接口都应该经过深思熟虑的设计。由于标准接口(包括c++的默认赋值操作符)是"危险的",所以将草率的接口添加为习惯不一定是一个好习惯。
在实践中,人们使用类来定义具有独立于其数据成员的新语义的新数据类型。既不使用访问器,也不使用公共数据成员,而是提供成员函数来执行与新数据类型相关的任务,同时维护数据成员的不变量。
当然,有时人们编写的类只是数据的聚合,没有额外的语义。在本例中,填充public成员的struct
是合适的。
除了数据封装之外,使用Get/Set方法的一个基本原因是控制输入类型。
如果您不想接受某些特定的输入类型,例如您可能不想要分数超出[0,100]区间的界限,那么您可以在Set方法中检查此条件,以便库用户不能进行不合逻辑的操作。
如果它是一个简单的读/写操作,那么您实际上不必将数据设为私有。但是,如果需要对读/写的数据执行验证/条件,则将其设置为private是有意义的。
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 我必须让数据保密吗?