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

Effective C++ 条款 20:宁以 pass-by-reference-to-const 替换 pass-by-value

文章目录

    • 条款 20:宁以 pass-by-reference-to-const 替换 pass-by-value
      • 核心思想
      • 优势
      • 示例代码
      • 特例:内置类型和小型对象
      • 结论

条款 20:宁以 pass-by-reference-to-const 替换 pass-by-value


核心思想

C++ 默认以 pass-by-value 方式传递对象至函数。这意味着:

  • 函数参数是调用时实际实参的副本(通过拷贝构造函数创建)。
  • 函数返回的对象也是返回值的副本。

然而,这种方式在处理复杂对象时可能引发性能问题,甚至导致 切割问题 (slicing problem)。因此,建议对非内置类型采用 pass-by-reference-to-const


优势

  1. 避免不必要的拷贝

    • 通过引用传递对象,避免了拷贝构造函数的调用,提升性能。
  2. 避免切割问题

    • 切割问题发生在传递一个派生类对象时。如果使用 pass-by-value,只会复制基类部分,导致多态性丢失。pass-by-reference-to-const 则能完整保留对象的类型信息。
  3. 可读性与安全性

    • const 限定保证了参数在函数内部不会被修改,增强代码安全性和可读性。

示例代码

// Pass-by-reference-to-const 示例
void printNameAndDisplay(const Window& w) {
    std::cout << w.name();
    w.display();
}

在上例中,通过 const Window& 传递对象,避免了调用 Window 的拷贝构造函数,同时确保 w 在函数中不可修改。


特例:内置类型和小型对象

  • 对于 内置类型(如 int, double, char)以及 STL 的迭代器和函数对象pass-by-value 更适合:
    • 内置类型的拷贝开销很低。
    • 使用引用可能会增加间接访问的成本。
// Pass-by-value 示例
void processValue(int x);           // 推荐
void advanceIterator(std::vector<int>::iterator it); // 推荐

结论

  1. 对于非内置类型,优先使用 pass-by-reference-to-const
  2. 对于内置类型和小型对象,优先使用 pass-by-value
  3. 这种策略既能提升代码性能,又能避免潜在问题(如切割问题)。

http://www.kler.cn/a/458474.html

相关文章:

  • 【网络安全实验室】SQL注入实战详情
  • goView二开低代码平台1.0
  • 头歌实训2-1:面向对象程序设计-基础部分
  • Linux-mac地址
  • 12.31【Linux】shell脚本【运行方式,修改环境变量,数组】思维导图 内附练习
  • Kafka 幂等性与事务
  • C++ 设计模式:单例模式(Singleton Pattern)
  • 如何使用爬虫工具Selenium
  • 腾讯PHP经典面试题(附答案)
  • zookeeper+kafka的windows下安装
  • 【服务器项目部署】⭐️将本地项目部署到服务器!
  • 鸿蒙项目云捐助第二十七讲云捐助项目首页分类导航的联动效果
  • go下载依赖提示连接失败
  • 农家乐系统|Java|SSM|VUE| 前后端分离
  • Flink状态编程
  • C++运算符重载实例
  • 学习记录2024/12/25;用C语言实现通讯录功能
  • 将 SOLID 原则应用于 Spring Boot 应用程序
  • .Net Core配置系统
  • 力扣251题详解:展开二维向量的多种解法与模拟面试
  • 无法验证服务器身份是什么意思?
  • 关于harmonyOS Next中状态管理的学习
  • 探秘 Neat 公司的自动测试架构:如何高效创造与价值保持
  • ThinkPHP 8开发环境安装
  • 【IC验证】verilog及systemverilog特殊特性的分析
  • uniapp-vue3(下)