【问题标题】:Class vs Struct for data only?仅用于数据的类与结构?
【发布时间】:2010-09-30 16:38:16
【问题描述】:

在这种情况下,使用类而不是结构有什么优势吗? (注意:它只会保存变量,永远不会有函数)

class Foo { 
private:   
   struct Pos { int x, y, z };
public:    
   Pos Position; 
};

对比:

struct Foo {
   struct Pos { int x, y, z } Pos;
};

类似问题:

【问题讨论】:

  • 错字:应该是 { int x, y, z; }

标签: c++ class struct


【解决方案1】:

在 c++ 中,使用其中一个并没有真正的优势,结构和类之间的唯一区别是其成员的默认可见性(结构默认为公共,类默认为私有)。

就我个人而言,我倾向于将结构用于 POD 类型,而将类用于其他所有类型。

编辑:litb 在评论中提出了一个很好的观点,所以我要在这里引用他的话:

另一个重要的区别是 结构派生自其他 默认情况下为类/结构公共, 而类通过私有派生 默认。

【讨论】:

  • 另一个重要的区别是结构默认派生自其他类/结构公共,而类默认派生私有。
【解决方案2】:

"(注意:它只会保存变量,永远不会有函数)"

从不是一个大词。通常“从不”的意思是“最终”。既然如此,我建议你使用一个类。这样,当事情发生变化时,您就没有太多需要改变的地方了。

Java(和 Python)的人在一切都是类的问题上相处得很好。没有这些被 C++ 称为“结构”的专门的无方法类并没有对他们造成任何伤害。

【讨论】:

  • 是的,但在某些情况下,您必须将 C++ 复合类型与 C 代码、系统调用等一起使用。我更喜欢将其表示为结构。在所有其他情况下,我使用类。
  • 因此,在不太可能的情况下,将其重构为一个类非常简单。我敢打赌 VS 中有一个工具可以为你做这件事——如果你不使用 VS,其他地方也可以。
【解决方案3】:

类和结构之间的唯一区别在于结构成员默认是公共的,而类成员默认是私有的。所以我说选择你最喜欢的那个。我确信对于哪个更具可读性存在争论,但我真的认为这没什么大不了的。

【讨论】:

    【解决方案4】:

    structclass 在 C++ 中的意思是完全相同,除了结构成员和基的默认访问是公共的,而对于类是私有的。我倾向于为只有公共成员的类选择 struct,为其他所有内容选择类,但这只是样式问题。

    【讨论】:

      【解决方案5】:

      如果类型的内容没有内存分配问题(例如普通 int),那么使用 struct 就可以了,如果这是您想要的方式,并且您已经做出了有意识的决定,您可以证明这是合理的给那些使用你的代码的人。但是,如果任何成员是指针类型,那么您需要认真考虑内存管理问题。使用struct 可能仍然可以,但您更有可能需要析构函数和一些构造函数,等等。此时,您需要class

      【讨论】:

      • 在 C++ 中,还可以将构造函数和方法添加到 structs。
      【解决方案6】:

      本质上,结构和类之间的选择取决于你的风格和你想输入多少。

      • 如果您在类/结构中只有公共成员,您不妨使用 struct 关键字。这样您以后不必再输入“public:”。
      • 选择结构而不是类的另一个原因是隐式记录对象的意图。因此,您可以创建 POD 类型的结构体(即使它们包含构造函数和一些静态辅助方法等),并且您可以将类用于所有其他“常规”类。

      【讨论】:

        【解决方案7】:

        另一方面,结构通常用于聚合初始化数据结构,因为所有非静态数据成员无论如何都必须是公共的(C++03、8.5.1/1)。

        struct A {  // (valid)
        {
           int a;
           int b;
        } x = { 1, 2 };
        
        struct A {  // (invalid)
        private:
           int a;
           int b;
        } x = { 1, 2 };
        
        class A {  // (invalid)
           int a;
           int b;
        } x = { 1, 2 };
        
        class A {  // (valid)
        public:
           int a;
           int b;
        } x = { 1, 2 };
        
        class A {  // (invalid)
        public:
           int a;
        private:
           int b;
        } x = { 1, 2 };
        

        【讨论】:

          猜你喜欢
          • 2011-05-13
          • 2021-05-08
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多