我们先来看一个简单的程序:

#include <iostream>
using namespace std;class A
{
private:string name;string addr;
};void fun(A a)
{}int main()
{A a;fun(a);return 0;
}

我们在调用fun函数的时候, 会有形参的拷贝, 会调用A的构造函数, 由于name和addr都是string对象, 所以也会有构造。 也就是有三次构造, 对应的有三次析构, 消耗巨大, 何不以引用来传递呢?

#include <iostream>
using namespace std;class A
{
private:string name;string addr;
};void fun(A &a) // 引用, 不涉及临时对象的拷贝
{}int main()
{A a;fun(a);return 0;
}

这样, 就省略了3次构造, 3次析构, 效率杠杠的。 但是, 上述程序还有个问题, 我们可能担心fun函数改变了a, 所以, 应该加上const, 形成const形式的引用, 如下:

#include <iostream>
using namespace std;class A
{
private:string name;string addr;
};void fun(const A &a) // const形式的引用, 从此再也不用担心fun函数改变a了
{}int main()
{A a;fun(a);return 0;
}

而且, 熟悉C++多态的朋友肯定知道, 拷贝会导致对象切割, 如下:

#include <iostream>
using namespace std;class A
{
public:virtual void test(){cout << "A" << endl;}
};class B : public A
{
public:virtual void test(){cout << "B" << endl;   }
};void fun(A a) // 对象切割
{a.test();
}int main()
{B b;fun(b);return 0;
}

结果为:A

为了避免对象切割, 我们用引用, 为了避免改变b, 我们加const, 于是乎:

#include <iostream>
using namespace std;class A
{
public:virtual void test(){cout << "A" << endl;}
};class B : public A
{
public:virtual void test(){cout << "B" << endl;   }
};void fun(const A &a)
{a.test(); // error
}int main()
{B b;fun(b);return 0;
}

但是, 但是, 但是, 编译不通过, 为什么呢? 因为fun中, a是const引用, 所以不能调用非const函数,  修改为:

#include <iostream>
using namespace std;class A
{
public:virtual void test() const  // const函数{cout << "A" << endl;}
};class B : public A
{
public:virtual void test() const // const函数{cout << "B" << endl;  }
};void fun(const A &a)
{a.test();
}int main()
{B b;fun(b);return 0;
}

这样就OK啦, 结果为:B .可见, 对象没有被切割。

最后, 让我们来和Scott Meyers一起来嚷嚷:宁以pass by reference to const替换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

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

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

    记住: 尽量以pass-by-reference-to-const替换pass-by-value.前者通常比较高效,并可避免切割问题(slicing problem). 以上规则并不适用于内置类型,以 ...

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

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

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

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

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

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

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

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

  7. pass by value 与pass by reference 小结

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

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

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

  9. 【Effection C++】读书笔记 条款20~条款23

    [Effective C++]Part4 设计与声明 条款20:宁以pass-by-reference-to-const替换pass-by-value 尽量以pass-by-reference-to- ...

最新文章

  1. html工具提示错误,HTML-KickStart工具提示错误
  2. Python数据结构之链表(linked list)
  3. python计时器代码_用Python写计时器
  4. DFS深搜与BFS广搜专题
  5. 李超线段树 [Heoi2013]Segment
  6. 单元测试debug过程中,显示variables are not available
  7. C#的变迁史04 - C# 4.0 之多线程篇
  8. 内存管理(C语言中malloc和free的用法)
  9. 根子在上面的问题_岳晓光_出问题的根子在价值投资上_中金博客_中金在线
  10. 比特币与莱特币的区别
  11. python访问oracle_用Python操作Oracle
  12. 随手记android面试题,synchorinzed的一个面试题
  13. 二叉树求到某一个节点路径
  14. PacketFence ZEN 4.0.1 发布,网络接入控制
  15. 网页设计Dreamweaver【1】
  16. linux系统软件包下载
  17. 国产Linux系统deepin 小白双系统安装详细教程+笔记本双显卡处理设置+使用体验
  18. 曙光服务器虚拟软驱,曙光ipmi系统管理平台用户使用指南.docx
  19. ASP.Net MVC开发基础学习笔记(9):查看详情、编辑数据、删除数据
  20. re,正则表达式,requests,爬取小猪短租网

热门文章

  1. TryHackMe-VulnNet: Active(ez 域渗透)
  2. 【包教包会】分享一个CocosCreator组件——动作残影
  3. 什么是用户态和内核态?
  4. impact检测cable失败
  5. 卡尔曼(Kalman)滤波(三)-- 新息
  6. C语言产生随机数的方法
  7. android action bar 风格,Android ActionBar使用教程
  8. pythonocc 计算两点距离
  9. 数据结构 - 线性表(顺序表)C语言代码实现-处理整型数据(附详细解释)。 _清风明月
  10. 2020年中国碳纤维原丝供需及竞争现状分析,达产率正趋近国际水平「图」