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

传递引用比起传递值的参数有一个明显的优势就是,传递引用并不会构造新的对象,从而避免了构造函数和析构函数的开销,提升函数效率。

传引用参数的时候,如果使用const引用,可以告诉接下来要使用函数的人,这个数据在函数中不会被改变。

pass-by-value还会造成对象切割的问题,下面一段代码

#include<iostream>
#include<cstring>
#include<cstring>
using namespace std;
class base{
public:virtual void print()const{cout<<"I'm base class";}
};
class dev:public base{
public:void print()const{cout<<"I'm dev class";}
};void fun(const base a){a.print();
}
int main(){dev d;fun(d);return 0;
}

上面这段代码的结果是I'm base class。也就是说,无论传进来的是基类还是子类,通过传值产生的对象都会被看作一个基类对象。其子类对象所拓展的部分都会被丢弃。

解决对象切割问题的方法就是用传引用来代替传参

void fun(const base& a){a.print();
}

对于一些比较小的内置类型对象(int bool char)传递值可能会比传递引用更快。因为从原理上说,pass by reference其实还是传递的地址也就是指针,而那些类型不见得比指针更大。同时对于stl迭代器,传值也比传引用更快

对于复杂类型,还是建议使用传递引用,即使这个类看似很小。因为谁都无法保证这个类是永远不会改变的,如果对这个类进行扩充,仍然可能会使其变得很庞大。

《Effective C艹》读书笔记(13)相关推荐

  1. 《Effective C++》读书笔记(第一部分)

    有人说C++程序员可以分为两类,读过Effective C++的和没读过的.世界顶级C++大师Scott Meyers 成名之作的第三版的确当得起这样的评价. 本书并没有你告诉什么是C++语言,怎样使 ...

  2. 《Effective C++》读书笔记(一)

    <Effective C++>读书笔记 条款01:视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分(C, Obejct-Oriented C++, Te ...

  3. 【绝版C++书籍】《Effective STL》读书笔记

    <Effective STL>读书笔记 写在前面 0<Effective STL>中可能过时的内容 1 容器 第1条:慎重选择容器类型. 第2条:不要试图编写独立于容器类型的代 ...

  4. Effective C++ XMind读书笔记

    前段时间看了effective C++第三版,用XMind记了些读书笔记. part1 习惯C++ part2

  5. PHP-SOCKETS读书笔记1-3

    学习PHP2个月了,收获挺多.不过和别人不同的是,我更喜欢SOCKET.PHP在SOCKET这方面的文章太少了.所以决定写一系列PHP-SOCKET读书笔记.一直从最基本写到SOCKET_RAW. 实 ...

  6. Effective Modern C++读书笔记

    本笔记主要用于记录要领.体会及摘抄书中精华 第1章 类型推导 1.1 理解模板类型推导 在模板类型推导过程中 具有引用(&)或指针(*)类型的实参会被当成非引用类型来处理.换言之,其引用或指针 ...

  7. 《Effective Java》读书笔记 - 11.序列化

    Chapter 11 Serialization Item 74: Implement Serializable judiciously 让一个类的实例可以被序列化不仅仅是在类的声明中加上" ...

  8. 《Effective java》—–读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  9. 《More Effective C++》读书笔记

    一.基础议题(Basics) 1.仔细区别 pointers 和 references 当一定会指向某个对象,且不会改变指向时,就应该选择 references,其它任何时候,应该选择 pointer ...

  10. 《Effective C#》读书笔记——条目11:理解短小方法的优势C#语言习惯

    在应用程序开发过程中,开发者都力求写出更加高效的代码.但是当你想手工为C#编译器优化代码时,你的种种优化可能反倒会阻碍JIT进行更加高效的优化.因此,我们最好尽可能的写出最清晰的代码,将优化工作交给J ...

最新文章

  1. menudiv.php,在div PHP之外返回的短代码函数
  2. 谷歌对Deepfake亮剑:打造鉴假新工具,帮助媒体识别AI造假
  3. go 通道 返回_GCTT 出品 | Go 语言的缓冲通道:提示和技巧
  4. 有重叠与无重叠序列之序列检测与序列产生
  5. uhttpd 架构调用细节之lua
  6. 做网络推广时网站结构要如何进行优化呢?
  7. 如何编译Apache Hadoop2.2.0源代码
  8. 关于ListView顶部和底部滚(拖)动出现阴影解决方案
  9. 模拟CA机构制作CA机构证书
  10. context的使用
  11. Java基础 HashMap的添加 修改 遍历 Map.Entry Map.entrySet()的使用及实例
  12. 800万行代码的鸿蒙系统,在世界上处于什么水平?
  13. 自如:全额承担“望京跑路二房东”受害客户损失,预计约500余万元
  14. 易语言word模板复制粘贴_请给你的Word“打底妆”(让Word跑快些系列)
  15. 关于stat命令和时间戳
  16. php header是什么,学习猿地-php header什么意思
  17. Luogu2627 修剪草坪
  18. 计算机音乐专业学什么软件有哪些内容,电脑音乐入门装备(软件篇)
  19. 2022道路运输企业安全生产管理人员考试练习题及在线模拟考试
  20. 架构设计:系统间通信(36)——Apache Camel快速入门(上)

热门文章

  1. 数据化运营09 抓住问题关键:用相关性分析拆解多个影响因素
  2. 【Kali渗透全方位实战】通过获取到的hash进行密码破解!(Hashcat)
  3. 不知道怎么用小图标?简单的iconfont矢量图标教学,装饰你的网页
  4. mysql一行受影响是什么意思_行受影响 是什么意思
  5. 亚阈值区MOSFET阈值电压Vth随温度变化曲线仿真【Cadence】
  6. linux 文件修复工具,技术|在 Linux 系统下使用 PhotoRec TestDisk 工具来恢复文件
  7. matlab怎么输入二维数组,[转载]matlab中数组的输入
  8. SqlServer中计算实际年龄的方法
  9. 项目管理十大管理过程和知识领域思维导图(系统集成项目管理),如何学习系统集成项目管理教程
  10. JAVA对象转json字符串性能优化