Effective C++条款20解读:宁以pass by reference to const替换pass by value
我们先来看一个简单的程序:
#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相关推荐
- 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 ...
- effective c++ 条款20:宁以pass-by-reference-to-const替换pass-by-value
记住: 尽量以pass-by-reference-to-const替换pass-by-value.前者通常比较高效,并可避免切割问题(slicing problem). 以上规则并不适用于内置类型,以 ...
- 条款20 :宁以pass-by-reference-to-const 替换pass-by-value
缺省的情况下,C++是以by value方式传递对象至函数.函数实参都是以实际实参的复件为初始值,而调用端获得的亦是函数返回值的一个复件.这些复件系由对象的copy构造函数产出,这可能使得pass b ...
- Effective c++学习笔记条款20:宁以 pass-by-reference-to-const替换pass-by-value
Prefer pass-by-reference-to-const to pass-by-value 这个问题在在C++是非常常见的.传值和传引用巨大的差别在于你所使用的参数是其本身还 ...
- 条款20:宁以pass-by-reference-to-const替换pass-by-value
条款20:宁以pass-by-reference-to-const替换pass-by-value 缺省情况下C++是以by value 传递的.其副本是对象本身的copy 构造函数自动调用的. cla ...
- [C++学习] effective c++ 笔记 pass by value ,pass by reference
在编写函数的返回值和形参的时候,能 传引用(pass by reference) 就不要 传值 (pass by value). 这样是为了少调用 copy constructor ,可以提高效率. ...
- pass by value 与pass by reference 小结
缺省条件下,c++都是以pass by value形式传递函数参数的,而值传递的参数,编译器知道这个参数收到保护,不会修改其值,实际上修改的都是通过拷贝构造函数另外创建的参数副本,当函数返回时还要调用 ...
- Effective C++之条款20:宁以pass-by-reference-to-const替换pass-by-value
声明: 文中内容收集整理自<Effective C++(中文版)第三版>,版权归原书所有. 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正. 条款20: ...
- 【Effection C++】读书笔记 条款20~条款23
[Effective C++]Part4 设计与声明 条款20:宁以pass-by-reference-to-const替换pass-by-value 尽量以pass-by-reference-to- ...
最新文章
- html工具提示错误,HTML-KickStart工具提示错误
- Python数据结构之链表(linked list)
- python计时器代码_用Python写计时器
- DFS深搜与BFS广搜专题
- 李超线段树 [Heoi2013]Segment
- 单元测试debug过程中,显示variables are not available
- C#的变迁史04 - C# 4.0 之多线程篇
- 内存管理(C语言中malloc和free的用法)
- 根子在上面的问题_岳晓光_出问题的根子在价值投资上_中金博客_中金在线
- 比特币与莱特币的区别
- python访问oracle_用Python操作Oracle
- 随手记android面试题,synchorinzed的一个面试题
- 二叉树求到某一个节点路径
- PacketFence ZEN 4.0.1 发布,网络接入控制
- 网页设计Dreamweaver【1】
- linux系统软件包下载
- 国产Linux系统deepin 小白双系统安装详细教程+笔记本双显卡处理设置+使用体验
- 曙光服务器虚拟软驱,曙光ipmi系统管理平台用户使用指南.docx
- ASP.Net MVC开发基础学习笔记(9):查看详情、编辑数据、删除数据
- re,正则表达式,requests,爬取小猪短租网