课程比结构更安全吗?

时间:2010-04-14 07:44:46

标签: c++ class struct

默认情况下,结构的成员是公共的,而类的成员是私有的。我们可以通过适当的渠道访问私人数据成员(使用成员函数)。如果我们可以访问成员函数,我们可以在私有数据成员中读/写数据,所以它是如何安全的...我们正在访问它,我们也在改变数据......

5 个答案:

答案 0 :(得分:4)

访问说明符,例如privatepublic与安全性无关。例如,在C ++中,这些规范被编译掉,甚至不存在于编译的二进制文件中。

相反,访问说明符旨在使类型易于正确使用,并且难以正确使用。

答案 1 :(得分:4)

classstruct之间只有两种语法差异:

  1. class中,成员默认为private,而在struct中,默认为public
  2. 由于历史原因,可以使用class代替typename来声明模板类型参数。
  3. 事实上,

    之间没有区别
    struct X {
      void f() {}
    private:
      int i;
    };
    

    class Y {
      int i;
    public:
      void f() {}
    };
    

    classstruct更“安全”的唯一方法是通过默认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]中任何位置的不变量)定义明确。如果成员属性是公共的,则用户代码将更新存储或大小而不实际更新其他字段,并且该不变量可能会被破坏。

许多类具有正确用法的内部不变量。如果您编写的类包含带有用户电子邮件地址的字符串,则通过提供访问者方法,您可以控制传入的值是有效的电子邮件地址,而如果电子邮件字段是公共用户代码,则可以将其重置为任何内容...

整个问题是,您可以控制访问和修改成员的方式,并减少可能发生错误的位置数量和/或检测错误的可能性。