C++笔记(3)引用
引用是变量的别名。也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
1.创建引用
int i = 0;
int& r = i;//r是一个出初始化为i的整型引用,r和i的内存地址是相同的。
2. 引用和指针的区别
引用和指针很像,它们都不会创建副本,因此效率都很高。它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。指针可能传递一个
NULL过来,因此在使用前必须检查有效性;引用则必然代表某个对象,不需要做此检查。 - 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
- 选择成员的时候,引用使用点
.来查找,而指针则使用->来查找。
3.引用作为参数传递给函数
Time Time::Sum(const Time& t) const {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
在一般函数中,会将实参的值复制给形参,在被函数使用。如果实参占用大量内存,会使得内存开销很大。传递引用,代码的功能相同,但是使用的内存更少,速度将更快。
4.引用作为函数返回值
警告:不要返回指向局部变量或临时对象的引用!函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。
示例1:
Time Time::Sum(const Time& t) const {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
上述代码创建了一个新的Time对象(sum),表示另外两个对象的和。返回对象将创建对象的副本。
如果返回对象为Time&,则引用的将是sum对象。由于sum对象是局部变量,在函数结束时被删除,因此引用将指向一个不存在的对象。使用但会类型Time意味着将在删除sum之前构造它的拷贝,调用函数将得到该拷贝。
示例2:
#include <iostream>
using namespace std; int& getValue(); int main ()
{
int& a = getValue();
cout << "a is " << a << endl;
return 0;
} int& getValue()
{
static int ret = 100;
return ret;
}
(1)以引用返回函数值,定义函数时需要在函数名前加 &
(2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本
内容来自:
https://blog.csdn.net/wohu1104/article/details/108188895
《C++ Primer Plus》 p312
C++笔记(3)引用的更多相关文章
- WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新
原文:WPF笔记 ( xmlns引用,Resource.Binding 前/后台加载,重新绑定) 2013.6.7更新 1.xmlns Mapping URI的格式是 clr-namespace:&l ...
- [开发笔记]-“在引用COM组件时,出现了无法嵌入互操作类型。。。”的错误
这两天在做一个需要将wps文档转换成word文档的程序,在调用wps的com组件时项目编译是没有问题的,但当运行的时候却弹出了下面的错误提示: 从网上百度一番后,找到了正确的解决方法. 先从Com组件 ...
- C++学习笔记2——引用
1. int ival = 1; int &refVal = ival; //引用必须初始化,且类型严格匹配 2. int ival = 1; int &refVal = ival; ...
- (C/C++学习笔记) 十三. 引用
十三. 引用 ● 基本概念 引用: 就相当于为变量起了一个别名(alias), △与指针不同的是它不是一个数据类型 通过引用我们可以间接访问变量,指针也能间接访问变量,但引用在使用上相对指针更安全. ...
- PHP 笔记——文件引用
1. 文件路径 "文件路径"指的是被包含文件所在的绝对路径或相对路径. 在相对路径中,"./"表示当前目录,"../"表示当前目录的上级目录 ...
- Java学习笔记-方法引用
方法引用(Method Reference) 上一篇中记录了Lambda表达式,其可以创建匿名方法.当Lambda表达式只是调用一个存在的方法时,可以采用方法引用(JDK8具有的特性).如下: pub ...
- C++ 学习笔记之 引用
一.定义: 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 二.用法: 基本用法 例如: int & a = b; 引用作为函数返回值 先看一个例子: #inclu ...
- Java学习笔记day03_引用数据类型
1.引用数据类型 步骤: 1. 导包 2. 创建引用类型变量 类型 变量名 = new 类型名(); 3. 使用数据类型的功能 变量名.功能名(); 如Scanner类: import jav ...
- Visual Studio使用技巧笔记(引用程序集自动复制dll到引用项目目录)
copy /y $(TargetPath) $(SolutionDir)\[您项目引用dll文件的目录]\$(TargetFileName) 例如:copy /y $(TargetPath) $(So ...
- Android笔记之引用aar
把要引用的aar文件复制到目录app\libs中(我要引用的aar名为xybigdatasdk-release-out2.2.6.aar) 在build.gradle (Module: app)中添加 ...
随机推荐
- 操作流程分享:HDMI输入SIL9293C配套NR-9 2AR-18的国产GOWIN开发板
1. 产品概述 HDMI 输入配套板是用于 GOWIN NR-9 和 2AR-18 的开发板配套的 HDMI 输出板子.最 大分辨率支持 1920*1080P,60Hz 刷新率,24 位 RGB 色彩 ...
- Springmvc来做甘特图的显示控制。
springmvc没有Springboot好用:所以就用了ajax通信来获取数据,这其中有不少坑,我来带大家踩一踩. 1.在控制层中,接口不能直接返回Json格式. 我的解决方法可以使通过map,或者 ...
- 一站式指南:ClkLog部署环境配置指南
在今天的数字化世界中,数据管理和分析工具的选择对于企业的成功至关重要.ClkLog作为一款强大的日志分析工具,能够帮助企业从海量数据中洞察业务.提升效率.然而,如何才能顺利部署ClkLog系统,使其最 ...
- Dapr Outbox 执行流程
Dapr Outbox 是1.12中的功能. 本文只介绍Dapr Outbox 执行流程,Dapr Outbox基本用法请阅读官方文档 .本文中appID=order-processor,topic= ...
- MySQL正则表达式:REGEXP 和 LIKE
正则表达式作用: 根据指定的匹配模式匹配文中符合要求的特殊字符. REGEXP : ①操作符中常用的匹配列表: ②匹配特殊字符使用\\进行转义 \\. 能够匹配 . \\f 换页 \\n 换行 ...
- ARMS 助力羽如贸易打造全链路可观测最佳实践
简介: 随着奢侈品行业在我国快速发展,跨境电商市场不断扩张.作为电商行业初创企业的上海羽如贸易有限公司(简称羽如贸易)积极进行数字化创新,打破固有零售思维,借助可观测能力有效提升用户体验,为业务飞速增 ...
- 6 张图带你彻底搞懂分布式事务 XA 模式
简介: XA 协议是由 X/Open 组织提出的分布式事务处理规范,主要定义了事务管理器 TM 和局部资源管理器 RM 之间的接口.目前主流的数据库,比如 oracle.DB2 都是支持 XA 协议的 ...
- dotnet 警惕 async void 线程顶层异常
在应用程序设计里面,不单是 dotnet 应用程序,绝大部分都会遵循让应用在出现未处理异常状态时终结的原则.在 dotnet 应用里面,如果一个线程顶层出现未捕获异常,则应用进程将会被认为出现异常状态 ...
- WPF 更改 DrawingVisual 的 RenderOpen 用到的对象的内容将持续影响渲染效果
在 WPF 里面,可以通过 DrawingVisual 来进行使用底层的绘制方法,此方法需要调用 DrawingVisual 的 RenderOpen 拿到 DrawingContext 类型的对象, ...
- 2018-11-19-win10-uwp-使用-Azure-DevOps-自动构建
title author date CreateTime categories win10 uwp 使用 Azure DevOps 自动构建 lindexi 2018-11-19 15:26:4 +0 ...