为什么C++同时具有类和结构
Why does C++ have both classes and structs?
可能重复:
C++中的结构和类之间有什么区别
如果结构和类之间的唯一区别是默认的访问说明符(在C++中(,那么为什么C++也有类呢?
首先,它与C具有向后兼容性。其次(也是更重要的(,它有助于描述你的意图。标准约定是POD应该用struct
表示,数据和行为的集合应该用class
表示。
在设计面向对象层次结构时,您希望类具有私有的默认访问说明符,但结构需要具有公共的默认访问描述符,以保持与C.的兼容性。
与C.C的向后兼容性没有类,但有结构。
请注意,这只是.c文件文本中的"向后兼容性"。在C++中,结构实际上是类,默认的公开为public
,而不是默认的公开private
。
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风格结构被定义为so
extern "C" {
struct Bob {
int age;
int height;
};
}
在这种情况下,age更像是"offset+0"的别名,height更像是一个"offset+(sizeof(int(+与内存管理器边界对齐(的别名,而不是可以以任何所需方式实现的概念字段。
正如其他人所说,主要区别在于默认的保护级别(即公共或私有(。然而,它也很好地表明了数据结构的实际使用情况。例如,有时您可能想要一个类似于javabean的轻量级结构。在这种情况下,你可能只有:
struct point {
float x, y;
};
很明显,你在这里没有使用任何C++功能,而不是:
class point {
public:
float x, y;
};
你的意图还不太清楚。我可能会注意到第二个例子是糟糕的代码,因为有人没有提供getter和setter。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?