C++结构体与类:嵌入式开发者实战指南
C++在嵌入式系统中仍属小众选择,但当项目超越纯C的极限时,它成为首选语言。从C转型的开发者理解C结构体、C++类和C++结构体的细微差别至关重要。本文通过清晰示例和最佳实践建议揭示这些语言要素。
C语言中的结构体
C语言struct是聚合相关值的复合数据类型。可包含内置类型(如int、char)、位域或其他结构体。其目的是将逻辑相关的数据分组为单一对象。
struct coordinates { float x; float y; float z; };
编译器掌握struct coordinates布局,允许声明变量:
struct coordinates location;
使用点运算符访问字段:
location.x = 1.0; location.y = 2.0; location.z = 9.99;
虽可用三个单独float变量,但归为单一结构体简化函数参数传递并提升可读性。
位域赋予结构体独特能力:指定成员确切位宽,建模硬件寄存器时很有用。
struct bitreg { unsigned up: 3; unsigned down: 3; unsigned polarity: 2; };
struct bitreg变量通常占一字节,编译器自动生成掩码和移位代码。用法直观:
struct bitreg control; control.up = 1; control.down = 2; control.polarity = 3;
嵌入式硬件开发需注意两点:
- 现代32位CPU高效支持结构体操作,但低端处理器可能不支持。审慎使用结构体避免性能损失。
- 位域布局是实现定义的。编译器更改或更新可能改变字段顺序或对齐,潜在破坏硬件寄存器访问。此外编译器可能生成多次读/写操作,对只写寄存器可能有问题。
在C中,结构体本质是被动容器;除访问字段外无法在其上调用行为。C++解决了这一限制。
C++中的类
C++引入class构造,将结构体理念扩展为可封装数据和行为的完整数据类型。类的实例称为对象。
类与C结构体语法共通,但提供强大特性:
- 可包含成员函数(方法)。
- 成员默认私有,提供封装。仅当前置public:时变公有。
- 特殊构造函数和析构函数在对象创建和销毁时自动运行。
- 运算符重载允许定义内置运算符的自定义行为。
- 继承使一个类可派生自另一类,促进代码复用。
- 声明对象时直接用类名——无需class关键字。
示例:
class myclass { char a; int b; public: void fun(); myclass(); ~myclass(); }; myclass myobj; myobj.fun();
数据成员a和b仅在类成员函数内可访问。构造函数和析构函数管理对象生命周期。函数体在别处用作用域解析运算符定义:
void myclass::fun() { // implementation }
C++中的结构体
C++也支持struct,完全兼容C并继承类的额外能力。唯一区别:成员默认公有,而类成员默认私有。
等价于前例,结构体可写为:
struct mystruct { void fun(); myclass(); ~myclass(); private: char a; int b; };
类与结构体的选择
采取纪律性方法:仅需被动数据容器时用struct,延续C风格。需封装、行为或继承时保留class。此约定提升代码可读性和可维护性——长期嵌入式项目的关键素质。
记住,清晰、自文档化的代码比巧妙技巧更有价值。未来维护者(甚至耐心有限者)会感谢你的一致风格。
嵌入式
- Nucleus RTOS信号量:实用服务与数据结构
- 掌握事件标志组:Nucleus RTOS/SE实用服务与数据结构
- 掌握 C++ 变量、字面量与常量:核心概念与实战指南
- C++类与对象:面向对象编程实战指南
- C++ 动态内存管理:new 与 delete 专家级实战指南
- C++ 三种继承方式深度解析:public、protected 与 private
- C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
- C++日期时间完全指南:ctime库、tm结构体与格式化输出
- C++数据结构实战:结构体struct定义、访问、函数参数、指针与typedef别名
- C++重载机制深度解析:函数重载与运算符重载全攻略
- C++接口编程:抽象类与纯虚函数实现规范契约
- 精通 Java:理解对象、类与核心 OOP 概念