默认情况下,结构的成员是公共的,而类的成员是私有的。我们可以通过适当的渠道访问私人数据成员(使用成员函数)。如果我们可以访问成员函数,我们可以在私有数据成员中读/写数据,所以它是如何安全的...我们正在访问它,我们也在改变数据......
答案 0 :(得分:4)
访问说明符,例如private
和public
与安全性无关。例如,在C ++中,这些规范被编译掉,甚至不存在于编译的二进制文件中。
相反,访问说明符旨在使类型易于正确使用,并且难以正确使用。
答案 1 :(得分:4)
class
和struct
之间只有两种语法差异:
class
中,成员默认为private
,而在struct
中,默认为public
。 class
代替typename
来声明模板类型参数。 事实上,
之间没有区别struct X {
void f() {}
private:
int i;
};
和
class Y {
int i;
public:
void f() {}
};
class
比struct
更“安全”的唯一方法是通过默认private
成员轻轻地“压迫”您更好的封装。
确实没有必要引入一个新的关键字class
,Stroustrup自己曾经说过几次。 (如果你对这些事情感兴趣,请阅读他的书 C ++的设计和演变。)基本上,class
被引入以强调具有成员函数的struct
这一事实在C中使用术语的方式不再是一个“结构”:内置类型的松散耦合对象的集合。它是一个“类”,在某种意义上,该术语用于静态类型的面向对象语言,即使语法,它与struct
没有实际区别。
答案 2 :(得分:3)
主要是因为成员函数可以在存储之前验证值。例如,假设您有一个名为'age'的字段,该字段必须介于0到150之间。在结构(或具有公共字段的类)中,您可以执行obj.age = 200
。而如果你只有一个setAge(int)
方法,那么该方法可以在存储之前检查该值是否介于0和150之间,如果需要可能会抛出异常,或者只是在没有的情况下限制该值。
答案 3 :(得分:1)
public / private / protected关键字不是为了安全而是为了封装。您可以通过从接口(公开成员公开的地方)中分离实现(使用私有/受保护成员的位置 - 实际用于实现功能的那些)来设计您的类 - 该类的其他用户将访问/调用)因此您以后可以在不更改界面的情况下更改私有部件。外部对象只需要了解公共成员并安全地使用它们,无论实现如何。 如果你在谈论安全性,那么认为任何人都可以改变你班级的私人成员,如果他们真的想要并且知道班级的内部结构,只需用新值覆盖适当的记忆位置 - 但这里的问题不是关于安全性,它处于较低水平
答案 4 :(得分:1)
除了默认访问之外,使这些类和结构完全相同,问题是如何从界面封装内部表示有助于构建更健壮的代码。
主要区别在于您可以控制类数据的修改时间和方式,因此您可以控制类不变量。考虑一个具有指针和大小的简单向量类。通过将它们设置为私有,您可以控制它们的更改方式:如果调用resize
方法,则指针和内部大小变量都将被连贯更新,保持访问范围[0..size]中任何位置的不变量)定义明确。如果成员属性是公共的,则用户代码将更新存储或大小而不实际更新其他字段,并且该不变量可能会被破坏。
许多类具有正确用法的内部不变量。如果您编写的类包含带有用户电子邮件地址的字符串,则通过提供访问者方法,您可以控制传入的值是有效的电子邮件地址,而如果电子邮件字段是公共用户代码,则可以将其重置为任何内容...
整个问题是,您可以控制访问和修改成员的方式,并减少可能发生错误的位置数量和/或检测错误的可能性。