缺省的情况下,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相关推荐

  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

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

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

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

  4. pass by value 与pass by reference 小结

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

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

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

  6. 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 ...

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

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

  8. Java - 传参到底是哪种? pass by value or pass by reference

    在了解Java传参数是pass by value或是pass by reference之前,先了解=赋值的用法会对理解传参很有帮助 赋值(=)的用法 =的意义是赋值,但是这个赋值用在 基本类型 和 对 ...

  9. 数组名传参(pass by reference)

    数组名作为函数参数(pass by reference) 说明:以下定义了一个doube_array函数,接受整个数组为函数参数,将其中的值修改为原来的2倍. #include <stdio.h ...

最新文章

  1. [scala-spark]9. RDD创建操作
  2. 关于PS插件Nik Collection不兼容cc2021闪退的解决方法
  3. 有味道的耳机!男子误食AirPods 排出后仍可正常使用
  4. 【TensorFlow-windows】(一)实现Softmax Regression进行手写数字识别(mnist)
  5. 2给我背书_考研村 | 在哪一瞬间,你觉得寄宿考研学校的背书教室真好?
  6. 用Python能下载抖音无水印视频?免费教程来了!
  7. 3D打印的四种应用场合
  8. 潦草字体在线识别_遇到好看的字体?不会识别?教你如何快速识别字体
  9. 常见外贸英文术语(下)
  10. 传奇GOM引擎授权过期解决方法.
  11. 阿里高频面试题:如何快速判断元素是不是在集合里?
  12. Spoon Kettle 输入之获取文件名(Get file names)
  13. [转载]中国移动深度定制首推“0元购TD手机”补贴政策
  14. 网站首页被篡改? 看我使用PhantomJS利器实现网站自动监控修改并截图发送企业微信预警
  15. 对比学习-SimSiam-论文精读解析
  16. qt+TCP文件传输
  17. 关于freemind.main.freemind can't be started
  18. 六月11号补题日记:Atorder Beginner Contest 305
  19. Python实现决策树(系列文章6)-- 名义型变量属性值分割(修正)
  20. 敏捷开发之需求评审会议

热门文章

  1. APUE读书笔记-16网络通信-08非阻塞和异步IO
  2. 全面降低windows系统的安全隐患 (五)
  3. tomcat ssi配置及升级导致ssi include错误问题解决
  4. 关于mysql数据库插入数据,不能插入中文和出现中文乱码问题
  5. 添加firefox4的deb源,直接安装
  6. 实用ISA Server 2006之一: 简介
  7. 使用JDBC连接SQL Server 2000 命名实例(Named Instance)
  8. http、https比较
  9. 渗透测试-基于白名单执行payload--Compiler
  10. python接口自动化(二十四)--unittest断言——中(详解)