【转载】本文主要参考链接下博主文章,再行总结的

传参的四种方式

按值传参

在调用函数时,将实参的值拷贝给形参,形参在函数中被使用。对形参的操作不会影响到实参的值。但是因为发生了拷贝会增加系统开销。
ps:传指针也是传引用的一种,因为指针就是一种特殊的变量。

按左值引用传参

那么怎么才能不发生拷贝,也不增加系统开销呢?或者是我们需要对实参的值进行操作呢?答案就是传引用作为参数。(也叫按(左值)引用传参)
引用相当于实参的别名,相当于在函数中直接操作实参,也没有发生拷贝自然也就没有增加系统开销。函数中对引用的操作也会引发对实参值的改变。

按常量引用传参

有时候我们只是希望减少系统开销,不进行传值拷贝,但是我们不想在函数中改变实参的值怎么办呢?于是,按常量引用传参也就来了,我们都知道被const修饰的变量的值是不能被改变的,所以在函数中我们只能取到实参的值,但是我们没有办法进行修改,同时也保留了减少拷贝开销的优点。

按右值引用传参

按右值引用传参是c++11新增的语义。
对于右值来说,其存储的是临时的将要被摧毁的资源,移动一个对象的状态总会比赋值这个对象的状态要来的简单(开销小)。

实际开发中该如何选择

返回传值的三种方式

我们首先思考几个问题,在c++返回传值的表现:
1、被传递的值是否持续存在?
2、传递的过程中是否发生了拷贝
3、传递过程中是否会自动转化为移动语义(c++11新增)
4、…等等
这几个问题主要与两方面有关系:

1、被返回的值

被返回的值有以下两种:
1、左值还是右值
2、临时变量(作用域在函数内)还是非临时变量(函数外定义的)
当被返回的值是一个右值或者临时变量时,我们选择直接将其值移动到返回接受这个值的地方,节省资源开销,c++就是这样做的。

2、返回类型

返回类型分为三种:
1、按值返回,产生拷贝
2、按常量引用返回,则如果调用方使用常量引用接受返回值则不产生拷贝。
3、按引用返回,则既不产生拷贝,并且还能对齐值进行修改(罕见)

按值返回

int randInt(const vector&arr)
{
return arr[randomInt(0,arr.size() - 1)];
}
vectorvec;
int a = randInt(vec);
最常见的返回值不多说,发生拷贝。因为被返回的值不是临时变量,而是一个非临时变量的左值,在返回传值的时候,将它的值拷贝给a变量。

按常量引用返回

既然传值返回会出现拷贝开销,为了解决这个问题,我们的返回值类型选择引用不就可以了吗。我们常选择(常量)引用的方式。
注意这里我们调用方的变量需要也是常量引用,不然会发生(const转非const)拷贝转化的。

按引用返回

按引用返回的场景比较少,多见于调用者需要对于返回对象的内部的数据进行修改。

实际开发中如何选择呢

【详细】传参的四种方式以及返回传值的三种方式相关推荐

  1. vue-router传参的四种方式超详细

    vue路由传参的四种方式 一.router-link路由导航方式传参 父组件:<router-link to="/跳转到的路径/传入的参数"></router-l ...

  2. 【vue】vue组件传值的三种方式

    前言 vue的组件传值分为三种方式:父传子.子传父.非父子组件传值 引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递 父组件通过 prop 给子组件下发数据,子组件通过事件 ...

  3. 四旋翼飞行器12——飞控接收机的三种接收模式

    四旋翼飞行器12--飞控接收机的三种接收模式 文章目录 四旋翼飞行器12--飞控接收机的三种接收模式 一.PWM型 二.PPM型 三.SBUS 无线遥控就是利用高频无线电波实现对模型的控制.如天地飞的 ...

  4. Vue组件传值的三种方法

    Vue组件传值的三种方式 1.父传子 父传子使用props: 1.父组件:即在使用的子组件标签上,自定义一个绑定数据,这里我使用的是"mymsg",将父组件的msg绑定在其上. 2 ...

  5. java连接MySQL几种方法_Java连接MySQL数据库三种方法

    好久没有更新博客了!今天利用周目时学习了一下数据库mysql.介绍一下数据库的三种连接方式! 开发工具:Myeclipse MySQL5.6 MySQL连接驱动:mysql-connector-jav ...

  6. No.002 关于Python函数返回值的三种情况

    关于Python函数返回值的三种情况,无返回值.有1个返回值,以及有多个返回值 # 本批次所有文章都是跟着马士兵的杨淑娟老师的视频教学所得,视频地址在下面: # https://www.bilibil ...

  7. vue路由传参的四种方式

    vue路由传参 一.router-link路由导航 父组件: 使用<router-link to = "/跳转路径/传入的参数"></router-link> ...

  8. PHP基础传参,PHP四种传参方式

    test1界面: testPHP //第一种设置传参方式,通过cookie setcookie('my','yefeng'); //第二种传参方式,通过设置服务器session值传递参数 sessio ...

  9. Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity

    一.在xml 中设置按键的onClick 绑定的函数 新建一个工程 然后在相关的页面添加一个Button 运行一下 实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任 ...

最新文章

  1. 人工智能正在激活互联网类脑系统,2018年,云脑将成为新热点
  2. JSON数据解析及gson.jar包
  3. SD-SD用到的文本对象列表
  4. @RequestMapping
  5. SQL中的事物【转】
  6. 让“学生看得明白” 复旦数学教授在无人教室录课程板书
  7. Hive+LDAP+Sentry
  8. 51Nod 1445 变色DNA
  9. java while循环_Java while循环
  10. php提取bing背景,PHP代码获取bing每日背景
  11. My thoughts after NOIP 2018(2)
  12. xmind思维导图怎么把字体变大_XMind 使用指南 | 让思维导图放大你的影响力
  13. 计算机研究生论文多少字,研究生一篇论文需要多少字?
  14. mysql实战22 | MySQL有哪些“饮鸩止渴”提高性能的方法?
  15. memcached php mysql_PHP: memcached
  16. 最多只需三步,彻底解决VB6中不能加载MSCOMCTL.OCX的提示
  17. WIN7远程桌面连接方法!远程控制教程!XP远程桌面连接教程!如何设置远程桌面连接?远程桌面连接设置!
  18. matlab 将矩阵转化成向量的两个方法
  19. 酷炫的业务看板大屏可以使用 Python 轻松制作( 附完整代码)
  20. 华为iMaster-NCE CampusInsight单机单平面独立部署方案

热门文章

  1. 研究了 babel.config.js 和 babelrc,理解了为什么ES6代码没被转化
  2. Apk打包、安装、签名
  3. Architectural Documentation in Rhino Rhino建筑文献 Lynda课程中文字幕
  4. 查询linux文件信息命令
  5. Xcode Revoke certificate
  6. Burp suite Intruder功能详解
  7. LAMP配置-php-fpm.conf
  8. 测试用例设计方法---因果图法
  9. php文件读写用什么函数,php中常用文件操作读写函数介绍_PHP教程
  10. tensorflow中的lrn函数详解