宁以pass-by-reference-to-const替代pass-by-value

有如下继承:

class Person
{public:Person();virtual ~Person();...
private:std::string name;std::string address;
}class Student : public Person
{public:iStudent();virtual ~Student();...
private:std::string schoolName;std::string schoolAddress;
}

1. 效率高效

有如下调用:

bool ValidateStudent(Student s);
Student plato;
bool isOk = ValidateStudent(plato);

使用pass-by-value的成本为:6次拷贝构造函数+6次析构函数。
Student的拷贝构造函数+
Person的拷贝构造函数+
Person内两个string的拷贝构造函数+
Student内的两个string的拷贝构造函数+
Student的析构函数+
Student内两个strring的析构函数+
Person的析构函数+
Person内两个string的析构函数

而使用pass-by-reference-to-const,上面12次函数调用全部省去。

修改为:

bool ValidateStudent(const Student& s);

2. 避免对象切割

class Window
{public:...std::string name() const;virtual void display() const;
};class SpecialWindow : public Window
{public:...virtual void display() const;
}void PrintNameAndDisplay(Window win)
{std::cout << win.name();win.display();
}

调用如下:

SpecialWindow sWin;
PrintNameAndDisplay(sWin);

由于通过pass-by-value传递参数,实参sWin传给形参win调用的是Window的拷贝构造函数,不会调用SpecialWindow的拷贝构造函数,出现对象切割。win.display();调用将始终调用Window::display();彻底失去“多态性”。

修改为:

void PrintNameAndDisplay(const Window& win)
{std::cout << win.name();win.display();
}

对于内置类型、迭代器、函数对象等比较小的对象,使用pass-by-value会比pass-by-reference-to-const更加高效。对于自定义的小的类也是如此。不过,类可能会随时变化,从小类变成大类。因此,基于扩展性考虑,对自定义类在传参数总是使用pass-by-reference-const保持函数接口的一致性。

请记住:

  • 尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题。
  • 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对他们而言,pass-by-value往往比较合适。

20. Prefer pass-by-reference-to-const to 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. pass by value 与pass by reference 小结

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

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

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

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

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

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

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

  6. Pass by reference和pass by value区别举例

    这是我见过的最好的解释pass by value和pass by reference的例子. 假设我要和你分享一个网页, 如果我告诉你URL链接,那我就是pass by reference,你可以通过 ...

  7. 方法参数中pass by reference(传引用)和 pass by value(传值)的区别

    如果你把㆒个名为foo的对象作为参数传给某个函数,那么「对参数赋值」意味改变foo,使它引用(参考.指涉.指向)另㆒个对象.如果你在「被传入对象」身㆖进行什么操作,那没问题,我也总是这样干.我只针对「 ...

  8. perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)

    这里主要讨论的是当你要传递的参数不是仅仅一个的时候,也就是两个以上,并且他们数据的类型还不一致的时候,我们要遇到的问题: 下面是一个例子: use strict;#这里是两个数组 my @i =('1 ...

  9. 数据成员是reference或const时该如何赋值?

    #include <string> #include <iostream>class Dog {public:// 成员是reference或const时必须在初始化列表中进行 ...

  10. intbyreference java_从内存出发,java是pass by value 还是pass by reference

    如果有人问你,java到底是pass by value还是pass by reference, 你一定要先斩钉截铁的说,java is pass by value. 我们先看一个简单的例子 publi ...

最新文章

  1. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
  2. 制作山寨智能机器人的一些记录 一 * 关于Arduino 以及外围模块的连接及使用...
  3. 数据科学 IPython 笔记本 8.10 自定义颜色条
  4. 转帖一篇关于DELPHI调试的文章-AQTime
  5. 计算机设备序列号都一样,如何使用adb工具
  6. 旋转链表 Java,leetcode 旋转链表 Java
  7. PaddleOCR二次全流程——1. 确定字体
  8. 如何解决网页显示不全和打不开的问题
  9. December in English(2017)
  10. React Hooks 分享
  11. 网络黑市规模达千亿元 信息泄露成最大安全威胁
  12. Technical support(技术支持)
  13. Note For Linux By Jes(1)-Linux 的文件权限与目录配置
  14. 提示“SystemSettings.exe-系统错误
  15. 技术视频下载地址分享
  16. 宇宙无敌第一帅的Java笔记
  17. QComboBox自定义(一)--类似QQ登陆界面的下拉框
  18. 百问网7天物联网智能家居 学习心得
  19. AutoCAD Civil 3D-创建道路模型(2 道路的挖填方量计算及条件部件)
  20. LDN 左移64单开槽蓝牙5.2双模RGB PCB(GH60兼容)

热门文章

  1. PowerDesigner的CDM模型将低驼峰命名法则的每个大写字母前加_符
  2. 李洪强iOS经典面试题30-一个区分度很大的面试题
  3. AVR之bootloader介绍
  4. 【创建型】Prototype模式
  5. 利用反射生成SQL语句
  6. 文件上传时判断是否为图片
  7. [转]ASP.NET MVC中你必须知道的13个扩展点
  8. C#保存PictureBox或Bitmap图片为bmp|png|gif|jpg格式
  9. 9.企业应用架构模式 --- 领域逻辑模式
  10. 17.高性能MySQL --- MySQL 分支与变种