[C++学习] effective c++ 笔记 pass by value ,pass by reference
在编写函数的返回值和形参的时候,能 传引用(pass by reference) 就不要 传值 (pass by value).
这样是为了少调用 copy constructor ,可以提高效率。
另外 传递& 引用,可以像用指针一样,能实现 “父类指针指向子类实例”的多态效果,传值没有多态的效果。
比如有类
class Person
{
private:string name,address;
public:Person(){cout << "Person constructor."<<endl; }Person(const Person& p){/*name = p.name;address = p.address;*/cout << "Person copy constructor" << endl;}~Person(){cout << "Person destructor."<<endl; }
};class Student:public Person
{
private:string schoolName,schoolAddress;
public:Student(){cout << "Student constructor."<<endl; }Student(const Student& s){cout << "Student copy constructor"<<endl;}~Student(){cout << "Student destructor."<<endl; }
};
函数 returnStudentTwo() 比 returnStudentOne() 效率高, 因为引用形参 &s 不必再调用拷贝构造函数来构造新的对象,只是另1个对象的别名。
Student returnStudentOne(Student s)
{return s;
}Student returnStudentTwo(const Student& s)
{return s;
}
const Student& returnStudentThree(const Student& s)
{
return s;
}
返回值也同理, returnStudentThree() 比 returnStudentTwo() 效率更高,因为引用形式的返回值也不需要调用拷贝构造函数。
但是引用作为返回值的时候需要注意,
绝不能返回 local 对象的reference ,这时必须要以传值的形式作为返回值。
比如函数 returnTestOne().在其他函数调用它的时候, 会产生不可预知的错误! 因为 s 在stack 内存, 函数结束时已回收, 而调用此函数的返回值,用的还是 s 这块内存,会非常危险。
returnTestTwo() 虽然用指针解决了这个问题,但是在函数中开辟的Heap内存,在外界非常容易忘记delete, 所以这样的写法会非常容易造成 memory leak .
所以,在需要值传递( pass by value )的时候 ,就老老实实写成 returnTestThree() 这种函数.
const Student& returnTestOne()
{Student s;return s;
}
const Student& returnTestTwo()
{
Student *s = new Student();
return *s;
}
const Student returnTestThree()
{
Student s;
return s;
}
以上这些内容就是复述一遍 effective c++ 里面的一些知识点,
道理虽然不难,但是还是自己上机写个 console 程序看看 log 印象更深刻一些。
并且平时也应该注意和运用书上所说的知识点才行。
[C++学习] effective c++ 笔记 pass by value ,pass by reference相关推荐
- Effective C++笔记_条款31将文件间的编译依存关系降至最低
Effective C++笔记_条款31将文件间的编译依存关系降至最低 这个章节,读了两遍还是不是很清楚,有一种没法和作者沟通的感觉,看来我还是一个C++的初学者呀.好吧,不多说了,回归主题,今天的笔 ...
- (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ
开源项目地址:d2l-ai/d2l-zh 教材官网:https://zh.d2l.ai/ 书介绍:https://zh-v2.d2l.ai/ 笔记基于2021年7月26日发布的版本,书及代码下载地址在 ...
- 吴恩达《神经网络与深度学习》精炼笔记(5)-- 深层神经网络
上节课我们主要介绍了浅层神经网络.首先介绍神经网络的基本结构,包括输入层,隐藏层和输出层.然后以简单的2 layer NN为例,详细推导了其正向传播过程和反向传播过程,使用梯度下降的方法优化神经网络参 ...
- 吴恩达《神经网络与深度学习》精炼笔记(4)-- 浅层神经网络
上节课我们主要介绍了向量化.矩阵计算的方法和python编程的相关技巧.并以逻辑回归为例,将其算法流程包括梯度下降转换为向量化的形式,从而大大提高了程序运算速度.本节课我们将从浅层神经网络入手,开始真 ...
- Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化
红色石头的个人网站:redstonewill.com 上节课我们主要介绍了逻辑回归,以输出概率的形式来处理二分类问题.我们介绍了逻辑回归的Cost function表达式,并使用梯度下降算法来计算最小 ...
- Flask-admin 学习及一些笔记
Flask-admin 学习及一些笔记 基本认识:flask-admin是flask的扩张,主要用于对flask应用程序增加管理界面. some notes: 在 BaseView 的子类中可以定义若 ...
- 【经典回放】JavaScript学习详细干货笔记之(三)
[经典回放]JavaScript学习详细干货笔记之(一) [经典回放]JavaScript学习详细干货笔记之(二) [经典回放]JavaScript学习详细干货笔记之(三) 一.再次从var开始说起 ...
- 【经典回放】JavaScript学习详细干货笔记之(二)
[经典回放]JavaScript学习详细干货笔记之(一) [经典回放]JavaScript学习详细干货笔记之(二) [经典回放]JavaScript学习详细干货笔记之(三) 一.JavaScript ...
- 【经典回放】JavaScript学习详细干货笔记之(一)
[经典回放]JavaScript学习详细干货笔记之(一) [经典回放]JavaScript学习详细干货笔记之(二) [经典回放]JavaScript学习详细干货笔记之(三) 目录 一.为什么要学Jav ...
最新文章
- java digester_Digester
- Linux-chown and chmod 命令的使用
- eclipse中也可以恢复删除的文件
- 小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难
- 360浏览器 - 自定义切换内核 meta标签 总结
- 【Java】判断学生成绩等级
- 错失黄金时期、连年亏损,国美App改名也难“真快乐”
- 查找一:C++静态查找
- 认识队列技术中的硬件队列和软件队列及如何改变硬件队列长度
- python 调试技巧
- 孙玄吴守星:全方位剖析边缘计算架构设计以及应用实践
- 华硕台式计算机光盘怎么启动不了,华硕台式机U盘启动不了怎么回事
- 第十二章 项目采购管理第六版
- 大名鼎鼎的 Linux —— 进程,线程,协程
- 《简约至上:交互式设计四策略》读书笔记
- GUI用户图形界面:GUILayout控件及使用例子
- 【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27
- K8s------Metallb实现Load Balancer服务
- Xna Beta的starter Kit spacewar研究手记(1)
- 美拍直播首屏耗时减少50%以上的优化实践
热门文章
- c语言编辑电子实时时钟,可以调整时间的电子时钟-C语言
- 2021-10-28 MyBatis学习
- android MVP——mvp架构的应用和优化
- 【Linux 内核笔记】进程管理
- 达梦数据库连接报错 error code=-70028 Create SOCKET connection failure. 创建SOCKET连接失败
- c4droid入门教程 2021.2.6更新
- 鸿蒙os后台运行,Day10 鸿蒙,Ability全家桶(二)如何后台运行任务
- 如何写 Cover Letter 论文投稿
- js一天、两天倒计时定时器实现方案
- 计算机内部为什么采用二进制表示数据,计算机内部为什么使用二进制处理数据? - 问答库...