声明:

  1. 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。
  2. 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。

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

Prefer pass-by-reference-to-const to pass-by-value.

函数pass-by-value参数都是以实际实参的拷贝为初值,这些拷贝是有对象的copy构造函数执行的,可能使得pass-by-value成为昂贵的费时操作。

通过pass-by-reference-to-const就可以回避所有的构造函数和析构动作了。

以pass-by-value方式传递参数可能导致slicing(对象切割)问题。当一个derived class对象以by-value方式传递给一个参数类型为base class对象,derived class对象会被视为 base class对象,而derived class的所有特化信息都会被切除。通过pass-by-reference方式可以解决slicing问题。

从C++编译器底层来看,references往往以指针实现出来,pass-by-reference通常意味着真正传递的是指针。

请记住:

  1. 尽量以pass-by-reference-to-const来代替pass-by-value,前者通常比较高效,并可以避免切割问题。
  2. 以上规则并不适用于内置类型以及STL迭代器和函数对象,对它们而言,pass-by-value往往比较适当。

Effective C++之条款20:宁以pass-by-reference-to-const替换pass-by-value相关推荐

  1. Effective C++条款20解读:宁以pass by reference to const替换pass by value

    我们先来看一个简单的程序: #include <iostream> using namespace std;class A { private:string name;string add ...

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

    缺省的情况下,C++是以by value方式传递对象至函数.函数实参都是以实际实参的复件为初始值,而调用端获得的亦是函数返回值的一个复件.这些复件系由对象的copy构造函数产出,这可能使得pass b ...

  3. Effective c++学习笔记条款20:宁以 pass-by-reference-to-const替换pass-by-value

    Prefer pass-by-reference-to-const to pass-by-value         这个问题在在C++是非常常见的.传值和传引用巨大的差别在于你所使用的参数是其本身还 ...

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

    条款20:宁以pass-by-reference-to-const替换pass-by-value 缺省情况下C++是以by value 传递的.其副本是对象本身的copy 构造函数自动调用的. cla ...

  5. [C++学习] effective c++ 笔记 pass by value ,pass by reference

    在编写函数的返回值和形参的时候,能 传引用(pass by reference) 就不要 传值 (pass by value). 这样是为了少调用 copy constructor ,可以提高效率. ...

  6. pass by value 与pass by reference 小结

    缺省条件下,c++都是以pass by value形式传递函数参数的,而值传递的参数,编译器知道这个参数收到保护,不会修改其值,实际上修改的都是通过拷贝构造函数另外创建的参数副本,当函数返回时还要调用 ...

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

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

  8. Effective C++ 50条款

    Effective C++ 50条款 条款 1:尽量用 const 和 inline 而不用#define--尽量用编译器而不用预处理 #define max(a,b) ((a) > (b) ? ...

  9. 《Effective STL》条款解读

    条款01:慎重选择容器类型 vector.list和deque有着不同的复杂度,vector是默认使用的序列类型.当需要频繁在序列中间做插入和删除操作时,应使用list.当大多数插入和删除操作发生在序 ...

最新文章

  1. 服务器温度3d显示,智能问答助手、3D可视化展示,腾讯医典“黑科技”助力科普更有温度...
  2. 单链表-删除单链表L中第一个值为x的结点的前驱结点(三指针法)
  3. STC15分时内核中函数指针的使用问题
  4. View-屏幕坐标 Content-网页(内容)坐标 mScrollX和mScrollY-屏幕坐标偏移
  5. postgresql主从备份_PostgreSQL主从流复制与手动主备切换架构
  6. 固特异发布人工智能球形轮胎:自动变形、自我修复、超级灵活
  7. 小波滤波器与其他滤波器的区别_滤波器国产 VS 国外
  8. c语言输入字符串smallbig,为什么输出不了small,这里big和small都是一样的操
  9. 虚继承中的构造函数的调用
  10. arm linux vlc移值,vlc-3.0.8在飞凌开发板i.mx6q上移植
  11. appcan 开发步骤
  12. 使用 window.open 打开新窗口
  13. service mesh解决的几个问题
  14. 52PJ官网 基础教程第二课的分享(OD)_Part1
  15. 【C#】基础篇(2) C#实现串口助手,C#扫描串口
  16. [MacBook Pro] 错误提示zsh_ command not found_ brew
  17. 2021年 - 年终总结
  18. 学计算机去旧金山,旧金山大学的计算机专业如何?
  19. 利用VARNA来画tRNA的二级结构
  20. 安装vfp9遇到的问题

热门文章

  1. APS入门4: 供应链与APS
  2. 阿里云 oss多文件上传
  3. [转载] 硬汉2奉陪到底
  4. 大数据时代,看完我和我的小伙伴都惊呆了
  5. U9二次开发之补丁制作
  6. Oracle 19c OCP的1Z0-082-CHN、1Z0-083-CHN和1Z0-082、1Z0-083有什么不同
  7. Eclipse ShotCut[From internet]
  8. 百度语音识别开放平台SDK用法
  9. 百度文字转语音Api,文字长度限制问题
  10. 试题 历届试题 九宫重排(双向广搜)