在编写函数的返回值和形参的时候,能 传引用(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相关推荐

  1. Effective C++笔记_条款31将文件间的编译依存关系降至最低

    Effective C++笔记_条款31将文件间的编译依存关系降至最低 这个章节,读了两遍还是不是很清楚,有一种没法和作者沟通的感觉,看来我还是一个C++的初学者呀.好吧,不多说了,回归主题,今天的笔 ...

  2. (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ

    开源项目地址:d2l-ai/d2l-zh 教材官网:https://zh.d2l.ai/ 书介绍:https://zh-v2.d2l.ai/ 笔记基于2021年7月26日发布的版本,书及代码下载地址在 ...

  3. 吴恩达《神经网络与深度学习》精炼笔记(5)-- 深层神经网络

    上节课我们主要介绍了浅层神经网络.首先介绍神经网络的基本结构,包括输入层,隐藏层和输出层.然后以简单的2 layer NN为例,详细推导了其正向传播过程和反向传播过程,使用梯度下降的方法优化神经网络参 ...

  4. 吴恩达《神经网络与深度学习》精炼笔记(4)-- 浅层神经网络

    上节课我们主要介绍了向量化.矩阵计算的方法和python编程的相关技巧.并以逻辑回归为例,将其算法流程包括梯度下降转换为向量化的形式,从而大大提高了程序运算速度.本节课我们将从浅层神经网络入手,开始真 ...

  5. Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了逻辑回归,以输出概率的形式来处理二分类问题.我们介绍了逻辑回归的Cost function表达式,并使用梯度下降算法来计算最小 ...

  6. Flask-admin 学习及一些笔记

    Flask-admin 学习及一些笔记 基本认识:flask-admin是flask的扩张,主要用于对flask应用程序增加管理界面. some notes: 在 BaseView 的子类中可以定义若 ...

  7. 【经典回放】JavaScript学习详细干货笔记之(三)

    [经典回放]JavaScript学习详细干货笔记之(一) [经典回放]JavaScript学习详细干货笔记之(二) [经典回放]JavaScript学习详细干货笔记之(三) 一.再次从var开始说起 ...

  8. 【经典回放】JavaScript学习详细干货笔记之(二)

    [经典回放]JavaScript学习详细干货笔记之(一) [经典回放]JavaScript学习详细干货笔记之(二) [经典回放]JavaScript学习详细干货笔记之(三) 一.JavaScript ...

  9. 【经典回放】JavaScript学习详细干货笔记之(一)

    [经典回放]JavaScript学习详细干货笔记之(一) [经典回放]JavaScript学习详细干货笔记之(二) [经典回放]JavaScript学习详细干货笔记之(三) 目录 一.为什么要学Jav ...

最新文章

  1. java digester_Digester
  2. Linux-chown and chmod 命令的使用
  3. eclipse中也可以恢复删除的文件
  4. 小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难
  5. 360浏览器 - 自定义切换内核 meta标签 总结
  6. 【Java】判断学生成绩等级
  7. 错失黄金时期、连年亏损,国美App改名也难“真快乐”
  8. 查找一:C++静态查找
  9. 认识队列技术中的硬件队列和软件队列及如何改变硬件队列长度
  10. python 调试技巧
  11. 孙玄吴守星:全方位剖析边缘计算架构设计以及应用实践
  12. 华硕台式计算机光盘怎么启动不了,华硕台式机U盘启动不了怎么回事
  13. 第十二章 项目采购管理第六版
  14. 大名鼎鼎的 Linux —— 进程,线程,协程
  15. 《简约至上:交互式设计四策略》读书笔记
  16. GUI用户图形界面:GUILayout控件及使用例子
  17. 【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27
  18. K8s------Metallb实现Load Balancer服务
  19. Xna Beta的starter Kit spacewar研究手记(1)
  20. 美拍直播首屏耗时减少50%以上的优化实践

热门文章

  1. c语言编辑电子实时时钟,可以调整时间的电子时钟-C语言
  2. 2021-10-28 MyBatis学习
  3. android MVP——mvp架构的应用和优化
  4. 【Linux 内核笔记】进程管理
  5. 达梦数据库连接报错 error code=-70028 Create SOCKET connection failure. 创建SOCKET连接失败
  6. c4droid入门教程 2021.2.6更新
  7. 鸿蒙os后台运行,Day10 鸿蒙,Ability全家桶(二)如何后台运行任务
  8. 如何写 Cover Letter 论文投稿
  9. js一天、两天倒计时定时器实现方案
  10. 计算机内部为什么采用二进制表示数据,计算机内部为什么使用二进制处理数据? - 问答库...