C结构体和C++结构体

57

请问C和C++结构体的主要区别是什么?


10
C 结构体不能包含方法,而 C++ 结构体可以。 - vpram86
C 结构体基本上用于将数据分组。 - Ashish
2
C++结构支持继承。 :) - Agnel Kurian
C++结构体支持私有成员。 - sellibitze
6个回答

86
在C++中,structclass是完全相同的东西,除了struct默认为public类型,而class默认为private类型。
在C语言中,结构体名称属于自己的命名空间,因此如果你有一个struct Foo {};,你需要写struct Foo foo;来创建该类型的变量,而在C++中,你可以只写Foo foo;,尽管C样式也被允许。C程序员通常使用typedef struct {} Foo;来允许C++语法进行变量定义。
C编程语言也不支持可见性限制、成员函数或继承。

7
在C++中,结构体的名称也属于它们自己的命名空间。不同之处在于,在搜索标识符时,编译器首先会查找通用名称空间,如果未找到,则还会检查用户定义的类名称空间。在C++中,这是正确的:struct x {}; void x() {},而这个不正确:typedef struct x {} x; void x() {},因为全局标识符空间已经有了一个x(typedef),函数的声明会发生冲突(顺便说一下,在第一个示例中,创建变量需要写成struct x var,以便将标识符仅作为用户定义类型进行搜索)。 - David Rodríguez - dribeas

11

C++中,结构体与类的表现方式相似,都可以包含方法、构造函数、析构函数等等...

类和C++结构体的主要区别在于:结构体内部默认为public,而类内部默认为private(即:外部无法直接访问)


15
根据我的计算机科学教授所说,结构体和类的另一个区别是,“你无法使结构体失败”。 - Jeremy Friesner

7

C和C++的结构有几个不同之处。

  1. C中,定义结构类型值需要使用struct关键字,而在C++中则不需要。

  2. C中,结构内部没有函数。而在C++中,我们可以定义直接访问结构体数据成员的函数(在C++中称为方法)。

  3. C中,结构内部不存在访问修饰符的概念(例如private和public)。而在C++中,我们可以使用访问修饰符。默认情况下,所有成员都是public。

  4. C中,结构体不能具有静态成员,但在C++中结构体可以具有静态成员。

  5. 在C中,空结构体的大小是一个约束违规,但在C++中它的大小始终为1。

  6. 我们可以在C++中既有结构体指针也有结构体引用,但在C语言中只允许使用结构体指针(引用不是C语言的特性)。


在C语言中,当我们声明一个结构类型的变量时,必须写上struct关键字。例如:struct ABC var1, var2; 而C++则采用了缩小派生数据类型和内置数据类型之间差距的方法。因此,就像我们定义int或char一样,在这里我们可以直接声明结构变量,如:ABC var1, var2; - Sandeep_black
啊,好的,是的,我明白你的意思了,声明新变量时必须输入“struct”。 - FreelanceConsultant

4
除了以上的答案之外,还要记住 C++ 结构支持继承,因此可以包含指向虚函数表的指针。这在跨进程序列化和反序列化这些结构时可以产生很大的差异。模板也被支持。

你应该提到virtual方法,而不是vtable(在C++语言规范中并不存在)。 - Thomas Matthews
序列化和反序列化结构的最佳过程是具有单独访问数据字段(成员)的功能。适用于C和C ++语言。一个主要原因是编译器允许在成员之间添加填充(适用于两种语言)。 - Thomas Matthews
在C语言中,填充只是一些未使用的字节的问题,当数据以其二进制表示进行序列化和反序列化时。但是在C++中,当使用具有虚函数的类的对象时,可能会出现问题。 - Agnel Kurian

3

C语言中的结构体更类似于组合数据结构的定义。

C++语言中的结构体可以被视为一个类,但是所有成员变量的作用域都默认为public。


3

C语言中不能在结构体内定义函数。

C++语言中可以在类或结构体内定义成员函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接