(C/C++学习)21.C++中返回引用和返回对象以及传引用和传对象问题
说明:在学习和编写C++代码时,经常会遇到这样的问题:一个带返回值的函数,到底应该返回值呢,还是应该返回引用呢;在传递参数的时候,是应该传递参数的引用呢,还是应该传值呢?请看下面代码:
- 1 void myswap(int &a, int &b)
- 2 {
- 3 int temp = a;
- 4 a = b;
- 5 b = temp;
- 6 }
相信上面代码大家经看到,这就是一个常见的交换两个整数值的代码,但如果传递参数里面传的是值而不是引用呢,答案是这样的交换根本没用。
探讨:
1.其实当按引用传递对象的时候,调用函数以及被调用的函数都是对同一个对象进行操作,即传递的是对象本身;而当传递对象(值)的时候,会调用拷贝构造函数产生一个临时变量,而该临时的值即为传递参数的值。而此时,调用函数中操作的是原对象,即传递的对象,而被调用函数操作的只是原对象的一个副本,即通过拷贝构造函数生成的模子,因此,才有了上述交换失败的情况。
2.同样的道理, 返回对象时会生成返回对象的副本,返回对象的时间包括了调用复制构造函数来生成副本所需的时间和调用析构函数删除副本所需的时间。而返回引用则可以节省时间和内存。
- 1 Person& Person::operator++()
- 2 {
- 3 age = 10;
- 4 return *this;
- 5 }
- 6 Person Person::operator++()
- 7 {
- 8 Person tmp(10); //创建对象
- 9 tmp.age = 20;
- 10 return tmp; //返回对象的副本,此处不能返回引用
- 11 }
- 12
3.然而并不是所有地方都可以返回引用的,当被调用函数中新建了一个变量时,该变量是不能返回引用的。因为临时变量是有生命周期的,即在被调用函数内该临时变量才会存在,当函数结束并准备返回参数时,该临时变量已经不存在,这种情况下返回它的引用是不允许的。而这时候返回对象却是可以的,因为你返回的仅仅是其通过拷贝构造函数产生的一个副本。
(C/C++学习)21.C++中返回引用和返回对象以及传引用和传对象问题的更多相关文章
- C++中返回引用和返回值的区别
转自https://www.cnblogs.com/JMLiu/p/7928425.html 一.主要讨论下面两个函数的区别: int& at() { return m_data_; } in ...
- c++学习笔记(c++中的引用)
1.c++中的bool类型: 其实c语言中也有bool类型,如果是遵守c90标准的编译器(其实现在大量编译器都是c90标准的),对于bool类型的使用除了要使用头文件 stdbool.h外,与 ...
- C++函数中返回引用和返回值的区别
一.主要讨论下面两个函数的区别: int& at() { return m_data_; } int at() { return m_data_; } 上面两个函数,第一个返回值是int的引用 ...
- c++中赋值运算符重载为什么要用引用做返回值?
class string{ public: string(const char *str=NULL); string(const string& str); //copy构造函数的参数 ...
- java学习笔记——java中对象的创建,初始化,引用的解析
如果有一个A类. 1.例如以下表达式: A a1 = new A(); 那么A是类,a1是引用.new A()是对象.仅仅是a1这个引用指向了new A()这个对象. 2.又如: A a2; A代 ...
- JAVA学习笔记--方法中的参数调用是引用调用or值调用
文献来源:<JAVA核心技术卷Ⅰ>,第4章第5节 (没有相关书籍的可看传送门) ps:测试demo因为偷懒,用的是String对象 结论:Java使用的是对象的值引用.即将任何对象所在内存 ...
- vue学习(八) vue中样式 class 定义引用
//style<style> .red{ color:red; } .thin{//字体粗细 font-weight:200 } .italic{//字体倾斜 font-style:ita ...
- Asp.NetCore源码学习[2-1]:配置[Configuration]
Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...
- 一些关于angularJS的自己学习和开发过程中遇到的问题及解决办法
这篇文章也许会不定时更新,主要记录这段时间内自己遇到的angularjs学习开发的一些问题的解决办法.本文以摘抄为主,主要目的还是将自己遇到的困惑在各个地方查到的解决办法的汇总,给自己留个备忘吧. 1 ...
随机推荐
- Vijos 1523 贪吃的九头龙 【树形DP】
贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted ...
- struts2基础代码实现
结构图: load.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...
- Handle/Body pattern(Wrapper pattern)
Handle Body Pattern 一些设计模式,通过一系列非直接的间接的方式(这种间接的方式,可称其为 handle(把手)),完成接口与实现(实现可称为 body(主体))的分离 Handle ...
- python cmd 启动python项目报错:no module named “xxx”
场景:使用pycharm编辑器启动pyhon项目时可以启动,但使用cmd启动时,会报:no module named “xxx”的错误,此时,有两种情况: 1.no module named “xxx ...
- 基于Flink的视频直播案例(上)
目录 数据产生 Logstash部分 Kafka部分 Flink部分 配置/准备代码 视频核心指标监控 本案例参考自阿里云的视频直播解决方案之视频核心指标监控和视频直播解决方案之直播数字化运营. 基于 ...
- Mybatis 分页实现
一.插件 PageHelper(推荐使用) 原理:利用Mybatis的拦截器,截获需要分页的sql语句,在语句后面加分页条件,及获取总记录数等属性. 注意 插件属性类 参考一 参考二 实例: 第一步: ...
- 为npm设置代理,解决网络问题
为npm设置代理,解决网络问题 npm config set proxy=http://127.0.0.1:1080
- source命令用法(转载)
转自:http://zhidao.baidu.com/link?url=mNfsPHSjTEm7llgyMYx0UVNwkJmD_cxLeHtZnHcM6Ms8LDXofVHka_EzHi6GltbR ...
- 清北考前刷题day7早安
- tomcat8的session共享实现方案
tomcat8的session共享实现 下载tomcat 版本:apache-tomcat-8.0.53.zip 实现步骤,只需要两步 两个tomcat的server.xml都增加一样cluster配 ...