37.C++ 中 struct 和 class 区别
🔬 C++ 中 struct 和 class 区别
📋 总结
📖 内容概览
本文详细介绍C++中struct和class的区别,包括默认访问权限、继承特性、模板使用等方面,并对比C语言中的struct与C++中struct的差异,帮助读者深入理解两者的特性和适用场景。
🎯 核心概念
📌 1. C++中struct和class的主要区别
1.1 默认访问权限不同
| 特性 | struct | class |
|---|---|---|
| 默认成员访问权限 | public | private |
| 默认继承权限 | public | private |
1.2 模板参数定义
class可以用于定义模板参数:template<class T>- 没有
template<struct T>的语法,struct不能用于定义模板参数
1.3 设计意图差异
- struct:常用于表示多种数据类型的集合,更侧重于数据的封装
- class:完整的面向对象编程构造,支持封装、继承和多态,更侧重于行为和数据的结合
📌 2. C++的struct和C的struct区别
| 特性 | C语言struct | C++语言struct |
|---|---|---|
| 类型分类 | 用户自定义数据类型(UDT) | 抽象数据类型(ADT) |
| 成员函数 | 不支持 | 支持 |
| 访问权限 | 无 | 支持(默认public) |
| 继承 | 不支持 | 支持 |
| 多态 | 不支持 | 支持 |
| 类型名使用 | 必须加struct前缀(除typedef外) | 可直接作为类型名使用 |
| 💻 代码示例 |
1. 默认访问权限对比
// struct默认public成员struct MyStruct { int publicMember; // 默认public void publicMethod() {} // 默认public};// class默认private成员class MyClass { int privateMember; // 默认private void privateMethod() {} // 默认privatepublic: int explicitPublicMember; void explicitPublicMethod() {}};
int main() { MyStruct s; s.publicMember = 10; // 合法,struct成员默认public s.publicMethod(); // 合法
MyClass c; // c.privateMember = 20; // 编译错误,class成员默认private // c.privateMethod(); // 编译错误 c.explicitPublicMember = 20; // 合法 c.explicitPublicMethod(); // 合法 return 0;}2. 默认继承权限对比
// 基类struct Base { int baseMember;};
// struct继承struct,默认public继承struct DerivedFromStruct : Base { // baseMember 继承为public};
// class继承struct,默认private继承class DerivedFromClass : Base { // baseMember 继承为private};
int main() { DerivedFromStruct ds; ds.baseMember = 10; // 合法,public继承
DerivedFromClass dc; // dc.baseMember = 20; // 编译错误,private继承
return 0;}3. C与C++ struct使用差异
C语言示例
#include <stdio.h>
// C语言中使用structstruct CStruct { int x; int y;};
int main() { // 必须加struct前缀 struct CStruct c1; c1.x = 1; c1.y = 2;
// 使用typedef可以省略struct前缀 typedef struct CStruct CS; CS c2; c2.x = 3; c2.y = 4;
printf("c1: x=%d, y=%d\n", c1.x, c1.y); printf("c2: x=%d, y=%d\n", c2.x, c2.y);
return 0;}C++语言示例
#include <iostream>
// C++中使用structstruct CppStruct { int x; int y;
void print() { // 支持成员函数 std::cout << "x=" << x << ", y=" << y << std::endl; }};
int main() { CppStruct s; // 直接使用类型名,无需struct前缀 s.x = 1; s.y = 2; s.print(); // 调用成员函数
return 0;}⚠️ 注意事项
- 访问权限显式声明:无论使用struct还是class,建议显式声明成员的访问权限,提高代码可读性和安全性
- 继承关系明确:在继承时显式指定public/private/protected继承,避免依赖默认行为
- 设计一致性:团队开发中应统一struct和class的使用规范,通常struct用于数据集合,class用于完整的类设计
- C兼容性:在需要与C代码交互时,struct应保持简单数据结构,避免使用C++特有的特性 📚 总结与最佳实践
- struct和class的本质:在C++中,struct是class的一种特例,两者在语法上几乎等价,主要区别在于默认访问权限
- 选择原则:
- 当需要简单的数据聚合时,优先使用struct
- 当需要完整的面向对象设计,包括封装、继承和多态时,优先使用class
- 代码规范:
- 始终显式声明访问权限和继承方式
- 保持struct和class的使用一致性
- 为了C兼容性,struct应避免使用C++特有的高级特性
- 模板使用:只能使用class关键字定义模板参数 通过理解struct和class的区别,可以根据具体场景选择合适的构造,编写更加清晰、高效的C++代码。