C结构是未装箱的,而C++结构是装箱类型

C struct is unboxed while C++ struct is a boxed type?

本文关键字:结构 C++ 类型      更新时间:2023-10-16

正如许多书籍所提到的,与C++结构和类的区别在于访问控制描述符。因此,我想知道以下说法是否正确:

C中的结构是未装箱的:结构中的成员明显位于结构的分配位置旁边。但C++中的结构是一个类似于装箱类型的类:成员/标头位于其他位置,并且结构的分配位置包含一个指向成员/标头的指针。

这种理解正确吗?

是否可以在C++中创建一个未装箱的类型,其中也包含实例方法?

在我看来完全是胡说八道。

成员不会神奇地"位于其他地方",不涉及指针,并且头与无关。C++编译器甚至不知道头的存在!

此讨论中缺少的关键字是"POD"(纯旧数据结构)。(Boxing与.NET有关,也可能与Java有关——尽管我不记得Java术语中使用过这个词)

POD基本上意味着它可以通过"blitting bits"(memcpy,memmov)在内存中移动。C++标准规范中有明确的要求

C结构总是POD(纯旧数据),而C++类可以具有与(虚拟)继承相关的"额外魔力"。

看看这个:

C++中的POD类型是什么?

C、C++和C#都是非常不同的语言,看起来你正试图用另一种语言来看待它们。你关于拳击的说法在C或C++上下文中没有任何意义。

另请参阅:

  • 什么';.NET中结构和类的区别是什么?

  • C++中的结构和类之间有什么区别?

  • (当然,C没有class es)

不,这是完全不正确的。你可以用C++编写一个完全兼容C的结构,并用C++编译代码,给它一个C接口。

然后,您可以让一个用C编写的程序使用结构并从库中调用函数,这样就不会有任何问题。

事实上,许多C++库操作C数据结构并与C.交互

虽然不建议您在结构中这样做,但它仍然可以移植到C.

struct X
{
#ifdef __cplusplus
private:
#endif
// members variables
#ifdef __cplusplus
public:
 // methods
#endif
};

但是当且仅当成员功能都不是虚拟的时才可移植。不确定这是否是文章所说的"拳击"的意思。

在c++中,结构和类之间的区别在于,正如您正确注意到的那样,隐式访问控制描述符。类是私有的,而结构是公共的。

因此以下内容:

struct A : B
{
  int x;
};

相当于:

class A : public B
{
public:
  int x;
};

根据我的理解,没有其他区别。