C struct是盒装类型时,C struct是unboxed吗?

时间:2012-02-08 00:24:37

标签: c++ c struct

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

  

C中的struct是unboxed:struct中的成员明显位于分配struct的位置。   但是C ++中的struct是类似盒子的类型:members / headers位于其他地方,并且分配struct的地方包含指向members / headers的指针。

这种理解是对的吗?

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

5 个答案:

答案 0 :(得分:7)

对我来说完全是胡说八道。

成员并非神奇地“位于其他地方”,没有涉及指针,而且标题无关。。 C ++编译器甚至不知道标头存在!

答案 1 :(得分:3)

此讨论中缺少的关键字是“POD”(Plain Old Data structure)。 (拳击与.NET和可能的Java有关 - 虽然我不记得使用这个词的Java术语)

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

C结构总是 POD(普通旧数据),而C ++类可以具有与(虚拟)继承相关的“额外魔法”。

看看这个:

What are POD types in C++?

答案 2 :(得分:2)

C,C ++和C#都是非常不同的语言,看起来你试图从另一个角度来考虑一个。关于拳击的陈述在C或C ++语境中没有任何意义。

另见:

答案 3 :(得分:1)

不,这完全是不正确的。您可以在C ++中编写一个完全C兼容的结构,并在C ++中使用它编译代码,为它提供一个C接口。

然后你可以用C编写的程序使用struct并从库中调用函数,不会有任何问题。

事实上,许多C ++库操纵C数据结构并与C进行交互。

虽然不推荐,但您可以在结构中执行此操作,并且仍然可以移植到C语言。

struct X
{
#ifdef __cplusplus
private:
#endif
// members variables

#ifdef __cplusplus
public:
 // methods

#endif

};

但只有在没有任何成员函数是虚拟的情况下才可移植。不确定这是否是文章所说的“拳击”。

答案 4 :(得分:0)

在c ++中,结构和类之间的区别就像你正确注意到的那样,隐式访问控制描述符。 class是private,而struct是public。

以下内容:

struct A : B
{
  int x;
};

相当于:

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

根据我的理解,没有其他差异。