在 C 和 C++ 中,struct 的用法有一些重要的区别。以下是两者的主要差异:
1. 默认访问权限
-
C++:
-
在 C++ 中,
struct的成员默认是 public 的。 -
在
class中,成员默认是 private 的。 -
示例:
cppstruct MyStruct { int x; // 默认 public }; class MyClass { int x; // 默认 private };
-
-
C:
- 在 C 中,
struct没有访问控制,所有成员都是 公开的 (相当于 C++ 的public)。
- 在 C 中,
2. 面向对象特性
-
C++:
-
在 C++ 中,
struct可以包含成员函数、构造函数、析构函数、虚函数、运算符重载等特性,与class基本相同。 -
示例:
cppstruct MyStruct { int x; MyStruct(int val) : x(val) {} // 构造函数 void print() { std::cout << x << std::endl; } // 成员函数 };
-
-
C:
-
在 C 中,
struct只能包含数据成员,不能包含函数。 -
示例:
cstruct MyStruct { int x; };
-
3. 继承和多态
-
C++:
-
在 C++ 中,
struct支持继承和多态,可以有虚函数和虚表。 -
示例:
cppstruct Base { virtual void print() { std::cout << "Base" << std::endl; } }; struct Derived : public Base { void print() override { std::cout << "Derived" << std::endl; } };
-
-
C:
- 在 C 中,
struct不支持继承和多态。
- 在 C 中,
4. 命名空间
-
C++:
-
在 C++ 中,
struct是定义在命名空间中的,可以直接使用。 -
示例:
cppstruct MyStruct { int x; }; MyStruct obj; // 直接使用
-
-
C:
-
在 C 中,
struct必须通过struct关键字使用,除非使用typedef。 -
示例:
cstruct MyStruct { int x; }; struct MyStruct obj; // 必须加 struct
-
5. 模板支持
-
C++:
-
在 C++ 中,
struct可以与模板结合使用。 -
示例:
cpptemplate <typename T> struct MyStruct { T data; };
-
-
C:
- 在 C 中,没有模板的概念。
6. 匿名结构体
-
C++:
-
在 C++ 中,匿名结构体可以直接使用。
-
示例:
cppstruct { int x; int y; } point;
-
-
C:
- C 也支持匿名结构体,但在某些编译器中可能需要开启扩展支持。
7. 构造和初始化
-
C++:
-
在 C++ 中,可以使用构造函数初始化
struct。 -
示例:
cppstruct MyStruct { int x; MyStruct(int val) : x(val) {} // 构造函数 }; MyStruct obj(10); // 使用构造函数
-
-
C:
-
在 C 中,只能通过显式赋值或初始化列表初始化
struct。 -
示例:
cstruct MyStruct { int x; }; struct MyStruct obj = {10}; // 初始化列表
-
总结
| 特性 | C 中的 struct |
C++ 中的 struct |
|---|---|---|
| 默认访问权限 | 全部公开(相当于 public) |
默认 public |
| 成员函数支持 | 不支持 | 支持 |
| 继承和多态 | 不支持 | 支持 |
使用时是否需要 struct |
必须加 struct |
不需要加 struct |
| 模板支持 | 不支持 | 支持 |
| 构造函数和析构函数 | 不支持 | 支持 |
在 C++ 中,struct 和 class 的功能几乎相同,唯一的主要区别是默认访问权限不同。