37.C++ 中 struct 和 class 区别

🔬 C++ 中 struct 和 class 区别

📋 总结

📖 内容概览

本文详细介绍C++中struct和class的区别,包括默认访问权限、继承特性、模板使用等方面,并对比C语言中的struct与C++中struct的差异,帮助读者深入理解两者的特性和适用场景。

🎯 核心概念

📌 1. C++中struct和class的主要区别

1.1 默认访问权限不同

特性structclass
默认成员访问权限publicprivate
默认继承权限publicprivate

1.2 模板参数定义

  • class可以用于定义模板参数:template<class T>
  • 没有template<struct T>的语法,struct不能用于定义模板参数

1.3 设计意图差异

  • struct:常用于表示多种数据类型的集合,更侧重于数据的封装
  • class:完整的面向对象编程构造,支持封装、继承和多态,更侧重于行为和数据的结合

📌 2. C++的struct和C的struct区别

特性C语言structC++语言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() {} // 默认private
public:
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语言中使用struct
struct 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++中使用struct
struct 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;
}

⚠️ 注意事项

  1. 访问权限显式声明:无论使用struct还是class,建议显式声明成员的访问权限,提高代码可读性和安全性
  2. 继承关系明确:在继承时显式指定public/private/protected继承,避免依赖默认行为
  3. 设计一致性:团队开发中应统一struct和class的使用规范,通常struct用于数据集合,class用于完整的类设计
  4. C兼容性:在需要与C代码交互时,struct应保持简单数据结构,避免使用C++特有的特性 📚 总结与最佳实践
  • struct和class的本质:在C++中,struct是class的一种特例,两者在语法上几乎等价,主要区别在于默认访问权限
  • 选择原则
    • 当需要简单的数据聚合时,优先使用struct
    • 当需要完整的面向对象设计,包括封装、继承和多态时,优先使用class
  • 代码规范
    • 始终显式声明访问权限和继承方式
    • 保持struct和class的使用一致性
    • 为了C兼容性,struct应避免使用C++特有的高级特性
  • 模板使用:只能使用class关键字定义模板参数 通过理解struct和class的区别,可以根据具体场景选择合适的构造,编写更加清晰、高效的C++代码。

Thanks for reading!

37.C++ 中 struct 和 class 区别

2026-01-23
1048 字 · 5 分钟

已复制链接

评论区

目录