关于类:为什么C ++同时具有类和结构?

Why does C++ have both classes and structs?

本问题已经有最佳答案,请猛点这里访问。

布尔奇1(P)如果结构和类别之间的唯一差别是缺乏获得具体信息的机会(在C++),那么为什么他们没有C++也有分类?(p)


首先,它与C向后兼容。其次(更重要的是),它有助于描述你的意图。标准惯例是,pods应该用struct表示,数据和行为的集合应该用class表示。


正如其他人发布的一样,主要区别在于默认的保护级别(即公共或私有)。然而,它也很好地说明了数据结构的实际使用。例如,有时你可能想要一个轻量级的结构,类似于Java bean。在这种情况下,您可能只需要:

1
2
3
struct point {
   float x, y;
};

很明显,这里没有使用任何C++特性,而不是:

1
2
3
4
class point {
public:
   float x, y;
};

不太清楚你的意图是什么。我可能会注意到第二个示例是坏代码,因为没有人提供getter和setter。


在设计面向对象的层次结构时,您希望类的默认访问说明符是私有的,但结构需要将默认访问说明符设置为公共的,以保持与C的兼容性。


与C.C的向后兼容性没有类,但它有结构。

请注意,这只是.c文件文本中的"向后兼容性"。在C++中,Struts是真正的类,默认的EDOCX1×2Ω暴露,而不是EDCOX1(3)的默认曝光。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Bob {
   // I haven't overridden the exposure, so it's private
   int age;
   int height;

   public:
     Bob();

};


struct Bob {
   // I haven't overridden the exposure, so it's public
   int age;
   int height;

   // note the constructor defaults to the"default" constructor.
};

这样定义了一个真正的C样式结构

1
2
3
4
5
6
extern"C" {
  struct Bob {
     int age;
     int height;
  };
}

在这种情况下,年龄更多地成为"offset+0"的别名,高度更多地成为"offset+(sizeof(int)+对齐内存管理器边界)的别名,而不是可以以任何所需方式实现的概念字段。