【发布时间】:2021-06-15 23:12:29
【问题描述】:
假设我有以下纯 C 结构
typedef struct
{
uint16_t id;
uint32_t address;
uint8_t type;
} Config;
typedef struct
{
Config cfg;
uint32_t ready;
} Instance;
我的问题是是否可以定义一个具有Instance 类型属性的 C++ 类
即
class A
{
public:
A();
private:
Instance instance;
};
如果是这样,编译器如何注意到 Instance 是纯 C 结构?是否需要使用A类构造函数的初始化部分来初始化instance?
【问题讨论】:
-
你应该阅读Standard Layout Type。
-
在 c++ 中,您的
Config和Instance与其他类一样。或者他们真的来自C?只是因为一个常见的误解是用struct声明的类与在C++ 中通过class声明的类有根本的不同 -
有可能吗?是的。编译器如何注意到它是一个普通的 C 结构?为什么要重要?如果是这样,您可以将
Instance结构的声明包含在extern "C" { ... }块中。是否有必要使用初始化部分...?如果你想初始化instance成员,可以使用它,就像任何其他成员一样,但它不是必需。 -
在 C++ 中,
struct和class是声明类型的同义词。两者之间的唯一区别是struct具有public默认值,class具有private默认值。 (对于成员和继承。)在 C++ 中,两者都实例化对象。与(例如)C# 或 D 相比,它们没有被语言区别对待,它们区别对待class和struct。