条款20 :宁以pass-by-reference-to-const 替换pass-by-value
缺省的情况下,C++是以by value方式传递对象至函数。函数实参都是以实际实参的复件为初始值,而调用端获得的亦是函数返回值的一个复件。这些复件系由对象的copy构造函数产出,这可能使得pass by value成为昂贵的操作。
考虑下面的继承体系:
classPerson{
public:
Person();
vitual~Person();
private:
std::stringname;
std::stringaddress;
};
classStudent:publicPerson{
public:
Student();
virtual~Student();
private:
std::stringschoolName;
std::stringschoolAddress;
};
现在有一个调用函数validateStudent,要调用一个Student实参并返回它是否有效?
boolvalidateStudent(Students);
Studentplato;
boolplatoIsOK=validateStudent(plato);
当上述调用发生时,会发生什么事?我们用图来说明:
这样结束了吗?也不是这些吧。再看。
我们知道Student类继承了Person类,而且两个类中,都有string类类型的变量。My God
如果有一个方法可以回避这些所有的构造函数与析构函数,那就好了。
有的,那就是以pass by reference to const.
boolvalidateStudent(constStudent&s);
注意,采用此种方式,还在以避免对象被切割。
voidprintStudent(Personp){
cout<<schoolaName<<endl;//Error ,
}
…
Studentplato;
printStudent(plato); //本来想着要打印名字,但是由于对象被切割,会出现问题
为什么用引用了之后,可以避免被切割?
如果窥视C++底层的话,你就会发现,reference往往是以指针实现出来的。因此,传递过来的指针。
如果你的参数是一个内置类型,则采用pass by value会比pass by reference to const更加有效率一些。
请记住:
l 尽量以pass by reference to const替换pass by value。前者通常比较高效,并可避免切割的问题。
l 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass by value更加适当。
转载于:https://www.cnblogs.com/loveyakamoz/archive/2012/11/15/2772408.html
条款20 :宁以pass-by-reference-to-const 替换pass-by-value相关推荐
- Effective C++条款20解读:宁以pass by reference to const替换pass by value
我们先来看一个简单的程序: #include <iostream> using namespace std;class A { private:string name;string add ...
- 条款20:宁以pass-by-reference-to-const替换pass-by-value
条款20:宁以pass-by-reference-to-const替换pass-by-value 缺省情况下C++是以by value 传递的.其副本是对象本身的copy 构造函数自动调用的. cla ...
- Effective c++学习笔记条款20:宁以 pass-by-reference-to-const替换pass-by-value
Prefer pass-by-reference-to-const to pass-by-value 这个问题在在C++是非常常见的.传值和传引用巨大的差别在于你所使用的参数是其本身还 ...
- pass by value 与pass by reference 小结
缺省条件下,c++都是以pass by value形式传递函数参数的,而值传递的参数,编译器知道这个参数收到保护,不会修改其值,实际上修改的都是通过拷贝构造函数另外创建的参数副本,当函数返回时还要调用 ...
- [C++学习] effective c++ 笔记 pass by value ,pass by reference
在编写函数的返回值和形参的时候,能 传引用(pass by reference) 就不要 传值 (pass by value). 这样是为了少调用 copy constructor ,可以提高效率. ...
- 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 ...
- 【Effection C++】读书笔记 条款20~条款23
[Effective C++]Part4 设计与声明 条款20:宁以pass-by-reference-to-const替换pass-by-value 尽量以pass-by-reference-to- ...
- Java - 传参到底是哪种? pass by value or pass by reference
在了解Java传参数是pass by value或是pass by reference之前,先了解=赋值的用法会对理解传参很有帮助 赋值(=)的用法 =的意义是赋值,但是这个赋值用在 基本类型 和 对 ...
- 数组名传参(pass by reference)
数组名作为函数参数(pass by reference) 说明:以下定义了一个doube_array函数,接受整个数组为函数参数,将其中的值修改为原来的2倍. #include <stdio.h ...
最新文章
- [scala-spark]9. RDD创建操作
- 关于PS插件Nik Collection不兼容cc2021闪退的解决方法
- 有味道的耳机!男子误食AirPods 排出后仍可正常使用
- 【TensorFlow-windows】(一)实现Softmax Regression进行手写数字识别(mnist)
- 2给我背书_考研村 | 在哪一瞬间,你觉得寄宿考研学校的背书教室真好?
- 用Python能下载抖音无水印视频?免费教程来了!
- 3D打印的四种应用场合
- 潦草字体在线识别_遇到好看的字体?不会识别?教你如何快速识别字体
- 常见外贸英文术语(下)
- 传奇GOM引擎授权过期解决方法.
- 阿里高频面试题:如何快速判断元素是不是在集合里?
- Spoon Kettle 输入之获取文件名(Get file names)
- [转载]中国移动深度定制首推“0元购TD手机”补贴政策
- 网站首页被篡改? 看我使用PhantomJS利器实现网站自动监控修改并截图发送企业微信预警
- 对比学习-SimSiam-论文精读解析
- qt+TCP文件传输
- 关于freemind.main.freemind can't be started
- 六月11号补题日记:Atorder Beginner Contest 305
- Python实现决策树(系列文章6)-- 名义型变量属性值分割(修正)
- 敏捷开发之需求评审会议
热门文章
- APUE读书笔记-16网络通信-08非阻塞和异步IO
- 全面降低windows系统的安全隐患 (五)
- tomcat ssi配置及升级导致ssi include错误问题解决
- 关于mysql数据库插入数据,不能插入中文和出现中文乱码问题
- 添加firefox4的deb源,直接安装
- 实用ISA Server 2006之一: 简介
- 使用JDBC连接SQL Server 2000 命名实例(Named Instance)
- http、https比较
- 渗透测试-基于白名单执行payload--Compiler
- python接口自动化(二十四)--unittest断言——中(详解)