当前位置: 首页 > news >正文

C++结构体初始化与成员函数实现语法详解

C++结构体初始化与成员函数实现语法详解

一、结构体静态成员初始化语法

在C++中,静态成员变量需要在类外部进行定义和初始化。提供的代码展示了如何为MAIN_PROPULSION_CAN类的静态成员变量进行初始化:

MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPULSION_CAN::currentVoltageThresholds = {0, 800, 750  // 0-800V, 高电压阈值750V
};

语法解析:

  1. MAIN_PROPULSION_CAN::VoltageThresholds - 完全限定类型名,表示属于MAIN_PROPULSION_CAN类的VoltageThresholds类型
  2. MAIN_PROPULSION_CAN::currentVoltageThresholds - 静态成员变量的完全限定名
  3. = {0, 800, 750} - 使用初始化列表对结构体成员进行初始化

这种初始化方式称为"聚合初始化",适用于简单的结构体类型。C++11以后也可以使用统一初始化语法:

MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPULSION_CAN::currentVoltageThresholds{0, 800, 750};

二、成员函数实现语法

类成员函数的实现需要包含类名限定符,如代码中展示的阈值设置函数:

void MAIN_PROPULSION_CAN::setVoltageThresholds(const VoltageThresholds& thresholds) {currentVoltageThresholds = thresholds;
}

语法要点:

  1. 返回类型:void表示函数不返回值
  2. 函数名前的类限定:MAIN_PROPULSION_CAN::表明这是类的成员函数
  3. 参数:const VoltageThresholds& thresholds - 常量引用参数,避免拷贝开销
  4. 函数体:简单的赋值操作,将参数值赋给静态成员变量

三、const引用参数的重要性

所有setter函数都使用了const引用参数:

void MAIN_PROPULSION_CAN::setTemperatureThresholds(const TemperatureThresholds& thresholds)

这样设计的好处:

  1. 避免大对象拷贝带来的性能开销
  2. const保证函数内不会意外修改传入的参数
  3. 引用传递比指针更安全,语法更简洁

四、静态成员变量的访问

在成员函数内部,静态成员变量可以直接访问:

currentTemperatureThresholds = thresholds;

虽然静态成员属于类而非对象,但在类的成员函数中访问时不需要类名限定。

五、良好的封装实践

这段代码展示了良好的面向对象封装原则:

  1. 数据成员设为private,防止外部直接修改
  2. 通过public的setter函数控制对内部状态的修改
  3. 相关阈值以结构体形式组织,提高代码可读性
  4. 静态成员集中管理全局配置

六、实际应用建议

在实际工程中,这种模式可以扩展为:

  1. 添加参数有效性检查
  2. 增加线程安全保护(如mutex)
  3. 添加日志记录阈值变更
  4. 实现观察者模式通知相关组件阈值变化

这种结构体加成员函数的模式在硬件接口、配置管理等场景非常实用,既能保持代码组织清晰,又能提供灵活的参数调整能力。


拓展:

深入了解一下 const TimingThresholds& thresholds 的用法。

1. 语法解析

  • const:表示这个引用指向的对象是常量,不能通过这个引用修改对象的内容。
  • TimingThresholds:这是一个结构体类型,表示一组时间相关的阈值。
  • &:表示这是一个引用,而不是一个副本。引用是一个别名,它指向实际的对象,而不是创建一个新的对象。
  • thresholds:这是引用的变量名,表示通过这个引用可以访问实际的 TimingThresholds 对象。

2. 为什么使用引用

在C++中,引用(&)是一种非常有用的技术,它允许函数直接操作传入的参数,而不是操作参数的副本。这有以下几个优点:

  • 性能优化:如果传递的对象比较大(例如一个大的结构体或类),传递引用可以避免复制整个对象,从而节省时间和内存。
  • 直接修改:如果需要在函数内部修改传入的对象,使用引用可以直接修改原始对象,而不是修改一个副本。

3. 为什么使用 const 引用

使用 const 引用可以确保函数不会修改传入的对象。这有以下几个优点:

  • 安全性:可以防止函数意外地修改传入的对象,从而避免潜在的错误。
  • 兼容性:允许函数接受常量对象作为参数,而不仅仅是非常量对象。这使得函数更加通用,可以接受更广泛的参数类型。

4. 示例代码

假设我们有一个 TimingThresholds 结构体,定义如下:

struct TimingThresholds {int64_t outputTooFastThreshold;int64_t outputTooSlowThreshold;int64_t noOutputThreshold;int64_t feedbackTooFastThreshold;int64_t feedbackTooSlowThreshold;int64_t feedbackTimeoutThreshold;
};

现在,我们定义一个函数,它接受一个 const TimingThresholds& 参数:

void printThresholds(const TimingThresholds& thresholds) {std::cout << "Output too fast threshold: " << thresholds.outputTooFastThreshold << " ns" << std::endl;std::cout << "Output too slow threshold: " << thresholds.outputTooSlowThreshold << " ns" << std::endl;std::cout << "No output threshold: " << thresholds.noOutputThreshold << " ns" << std::endl;std::cout << "Feedback too fast threshold: " << thresholds.feedbackTooFastThreshold << " ns" << std::endl;std::cout << "Feedback too slow threshold: " << thresholds.feedbackTooSlowThreshold << " ns" << std::endl;std::cout << "Feedback timeout threshold: " << thresholds.feedbackTimeoutThreshold << " ns" << std::endl;
}

在这个函数中,thresholds 是一个对传入的 TimingThresholds 对象的引用,但它是一个 const 引用,因此我们不能通过 thresholds 修改原始对象。

5. 调用函数

现在,我们创建一个 TimingThresholds 对象,并将其传递给 printThresholds 函数:

int main() {TimingThresholds thresholds = {200000, 80000, 120000, 400, 500, 5000};printThresholds(thresholds);return 0;
}

在这个例子中,thresholds 是一个 TimingThresholds 对象,我们将其传递给 printThresholds 函数。由于 printThresholds 函数接受一个 const TimingThresholds& 参数,因此它不会修改 thresholds 对象,同时避免了复制整个对象的开销。

6. 总结

  • const TimingThresholds& thresholds 表示函数接受一个对 TimingThresholds 对象的常量引用。
  • 使用引用可以避免复制对象,提高性能。
  • 使用 const 引用可以确保函数不会修改传入的对象,提高代码的安全性和兼容性。
  • 这种用法在处理大型对象或需要保证函数不会修改参数时非常有用。
http://www.xdnf.cn/news/1064323.html

相关文章:

  • webpack+vite前端构建工具 -6从loader本质看各种语言处理 7webpack处理html
  • c#websocket心跳包自定义实现,支持异步操作的取消
  • RN(React Native)技术应用中常出现的错误及解决办法
  • 可理解性输入:洗澡习惯
  • 【设计模式】策略模式 在java中的应用
  • 《Redis》事务
  • idea2023+zulu-jdk+maven3.9.10
  • 【后端】负载均衡
  • 解决OSS存储桶未创建导致的XML错误
  • LLMs之MCP:excel-mcp-server的简介、安装和使用方法、案例应用之详细攻略
  • 5.3 VSCode使用FFmpeg库
  • 一,python语法教程.内置API
  • modelscope设置默认模型路径
  • python中学物理实验模拟:凸透镜成像和凹透镜成像
  • springboot通过独立事务管理器实现资源隔离与精准控制​
  • C++ 函数模板
  • JavaEE初阶第三期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(一)
  • 【格与代数系统】偏序关系、偏序集与全序集
  • python的校园兼职系统
  • 5.2 Qt Creator 使用FFmpeg库
  • C++ 的设计模式
  • 一文详解归并分治算法
  • 逆向入门(16)程序逆向篇-Cabeca
  • Python列表常用操作方法
  • 百度萝卜快跑携4颗禾赛激光雷达进军迪拜,千辆L4无人车开启全球化战略
  • 我开源了一套springboot3快速开发模板
  • 课程目录:腾讯混元3D × Unity3D全流程开发
  • C++基础练习 sort函数,用于排序函数
  • 第17章 转换 todo
  • 机器学习15-XGBoost