20. Prefer pass-by-reference-to-const to pass-by-value
宁以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相关推荐
- Effective C++条款20解读:宁以pass by reference to const替换pass by value
我们先来看一个简单的程序: #include <iostream> using namespace std;class A { private:string name;string add ...
- 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 ,可以提高效率. ...
- 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 ...
- Pass by reference和pass by value区别举例
这是我见过的最好的解释pass by value和pass by reference的例子. 假设我要和你分享一个网页, 如果我告诉你URL链接,那我就是pass by reference,你可以通过 ...
- 方法参数中pass by reference(传引用)和 pass by value(传值)的区别
如果你把㆒个名为foo的对象作为参数传给某个函数,那么「对参数赋值」意味改变foo,使它引用(参考.指涉.指向)另㆒个对象.如果你在「被传入对象」身㆖进行什么操作,那没问题,我也总是这样干.我只针对「 ...
- perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)
这里主要讨论的是当你要传递的参数不是仅仅一个的时候,也就是两个以上,并且他们数据的类型还不一致的时候,我们要遇到的问题: 下面是一个例子: use strict;#这里是两个数组 my @i =('1 ...
- 数据成员是reference或const时该如何赋值?
#include <string> #include <iostream>class Dog {public:// 成员是reference或const时必须在初始化列表中进行 ...
- intbyreference java_从内存出发,java是pass by value 还是pass by reference
如果有人问你,java到底是pass by value还是pass by reference, 你一定要先斩钉截铁的说,java is pass by value. 我们先看一个简单的例子 publi ...
最新文章
- SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
- 制作山寨智能机器人的一些记录 一 * 关于Arduino 以及外围模块的连接及使用...
- 数据科学 IPython 笔记本 8.10 自定义颜色条
- 转帖一篇关于DELPHI调试的文章-AQTime
- 计算机设备序列号都一样,如何使用adb工具
- 旋转链表 Java,leetcode 旋转链表 Java
- PaddleOCR二次全流程——1. 确定字体
- 如何解决网页显示不全和打不开的问题
- December in English(2017)
- React Hooks 分享
- 网络黑市规模达千亿元 信息泄露成最大安全威胁
- Technical support(技术支持)
- Note For Linux By Jes(1)-Linux 的文件权限与目录配置
- 提示“SystemSettings.exe-系统错误
- 技术视频下载地址分享
- 宇宙无敌第一帅的Java笔记
- QComboBox自定义(一)--类似QQ登陆界面的下拉框
- 百问网7天物联网智能家居 学习心得
- AutoCAD Civil 3D-创建道路模型(2 道路的挖填方量计算及条件部件)
- LDN 左移64单开槽蓝牙5.2双模RGB PCB(GH60兼容)
热门文章
- PowerDesigner的CDM模型将低驼峰命名法则的每个大写字母前加_符
- 李洪强iOS经典面试题30-一个区分度很大的面试题
- AVR之bootloader介绍
- 【创建型】Prototype模式
- 利用反射生成SQL语句
- 文件上传时判断是否为图片
- [转]ASP.NET MVC中你必须知道的13个扩展点
- C#保存PictureBox或Bitmap图片为bmp|png|gif|jpg格式
- 9.企业应用架构模式 --- 领域逻辑模式
- 17.高性能MySQL --- MySQL 分支与变种