在 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
的功能几乎相同,唯一的主要区别是默认访问权限不同。