C++中的引用

2024-01-24

一、引用的概念

引用不是新定义一个变量,而是给已有变量取一个别名,编译器不会为引用变量开辟内存空间,而和它引用的变量共用一块内存空间。

注意,由于C++兼容C,所以&既可以是引用符号,也可以是取地址

int a = 0;
int& b = a;

cout << &a << endl;//0000009D826FF524
cout << &b << endl;//0000009D826FF524

补充:

1.同一个变量可以有多个别名

2.可以对变量的别名再取别名

3.引用必须初始化

4.引用不能该别指向

二、引用的基本使用场景

1.做函数参数

void swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int x = 10;
	int y = 20;
	swap(x, y);//函数接收到x与y后,相当于为x与y分别取别名为a和b
	cout << "x=" << x << " " << "y=" << y << endl;
	return 0;
}

2.做函数返回值

注意:不能返回局部变量(临时变量)的引用,否则可能会出现野引用

局部变量a在func函数执行完毕后即被销毁,主函数中用引用变量ret接收变量a,因此ret为野引用

int& func()
{
	int a = 10;
	return a;
}
int main()
{
	int& ret = func();//ret即为野引用
	return 0;
}

正确做法:返回静态变量,诸如此类的非临时变量的引用

int& func()
{
	static int a = 10;
	return a;
}
int main()
{
	int& ret = func();
	return 0;
}

三、引用和指针的区别

语法方面:

1.引用是取别名,无需开空间;指针是地址,需要开空间

2.引用必须初始化;指针可以初始化,也可以不初始化

3.引用不可以改变指向;指针可以改变指向

4.引用相对较安全,没有空引用,不易出现野引用;指针容易出现空指针和野引用

5.sizeof(引用)结果是引用指变量的大小;sizeof(指针)结果是4/8字节

底层实现方面:

汇编层面上,不存在引用,引用就是使用指针实现的,引用编译后也就成了指针

引用的本质是指针常量:int& b=a   即为 int* const b=&a

四、常量引用

1.常量引用,引用变量不可修改,即a不可再修改

void func(const int& a)
{
	cout << a << endl;
}

2.普通引用只能指向变量,常量引用可以指向常量,编译器会临时创建一个变量

const int &ret=10;//正确,const修饰后,编译器会临时创建一个变量
                  //int tmp=10;
                  //int &ret=tmp; 

3.引用作为函数参数时,常量引用和普通引用是不一样的,可以构成重载函数

void func(int &a)
{
    cout<<"func(int &a)的调用"<<endl;
}
 
void func(const int &a)
{
    cout<<"func(const int &a)的调用"<<endl;
}
int main(int argc, char** argv) {
    int m;
    func(m);//调用func(int &a) 
    func(3);//调用func(const int &a) 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的引用 的相关文章

随机推荐

  • 如果进程被终止,写入 write() 的数据是否会刷新到磁盘?

    我正在使用一个程序qdbm http sourceforge net projects qdbm 维护键值存储 qdbm 链接到程序中 在某些情况下 该进程会在 qdbm 数据库中放入一个值 然后通过调用外部 init 脚本 通过 syst
  • Phonegap垂直滚动

    我正在为 ios 构建一个phonegap 应用程序 并且遇到垂直滚动问题 即使没有任何内容 网络视图中似乎也会有一些像素滚动 这会影响我在 html 中内置的绝对定位的导航栏和选项卡栏 这是我的 html 页面 没有内容 但我仍然得到图像
  • Promise 重试,直到使用 Typescript 成功/失败

    我的移动应用程序会连续将多个文件上传到服务器 这些文件通常来自连接强度有问题的偏远地区 为此 我想尝试几次发送文件 我还想在失败时继续尝试下一个 导出结束时显示所有错误消息 即 已上传 10 个文件 3 个失败 但是 我无法弄清楚带有承诺的
  • 两行Xerces程序中的异常

    下面的代码给了我一个例外XMLFormatTarget行 但如果我更改字符串 C test xml to test xml 效果很好 test cpp Defines the entry point for the console appl
  • 将引号之间的逗号替换为空格

    您好 我的表中每一行都有如下数据 0150566115 HEALTH 401K IC ON ICON HEALTH 401K 1 08 21 2014 我想要的是删除双引号 之间的每个逗号 然后用逗号 分割字符串的其余部分 我不想检查双引号
  • std::sort 与本地类型比较

    下面的例子 file mysort cc include
  • Python 抓取 JSON 并将其转换为 CSV

    我对 python 很陌生 这可能是一个可怕的问题 但事情是这样的 我正在尝试从特定网站抓取数据并将该数据转换为 CSV 我已经设法获得一个可用的 scraper 并将文件保存在我的计算机上 然而 当我尝试再次将 JSON 加载到 pyth
  • swift:以编程方式创建 UILabel 固定宽度,根据文本长度垂直调整大小

    我见过涉及自动布局的垂直调整大小的答案 但是UILabel我正在创建的仅在运行时需要 我可能需要从零到多个这样的标签 示例 忽略颜色 短文本 注意与长文本宽度相同 较长的文本 注意与较短的文本示例宽度相同 并具有更多行用于添加文本 如果文本
  • Firebase - 当 Websocket 被公司代理/防火墙阻止时,是否有一个标志可以强制进行长轮询?

    我正在开发一个简单的企业 AngularJS 应用程序 并计划使用 Firebase 作为后端 我必须支持的浏览器是IE8和Chrome 最新 我已经成功修复了前端中所有与 IE 相关的问题 并且可以成功从我的 Firebase 检索数据
  • Eclipse:垂直排列函数参数

    我在 Windows 7 专业版上运行 Eclipse 3 7 2 如果我输入这样的方法声明 private void processCode String codename boolean doSomethingElse int num
  • 使用 Swift 将数据发布到服务器

    很快我几天来就一直面临这个问题 我不知道我在这里开始的错误是我的 viewcontroller swift import UIKit import Foundation var otp 0 class ViewController UIVi
  • JVM实现接口和纯抽象类的区别?

    我和我的朋友想知道 JVM 内部的接口和纯抽象类之间是否真的存在区别 或者它是否只是真正的语法糖 我真的不明白为什么会有差异 但它可能并不那么牵强 就字节码而言 classfile 而言 它们是完全不同的 From 4 1 类文件结构 ht
  • 需要示例 Java 代码来运行 shell 脚本 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我尝试了许多不同的例子 但它不起作用 我真的很感激一些运行 shell 脚本的示例 Java 代码 您需要 Runtime getRunt
  • 重命名 BitBucket 上配置的 git 项目的最简单方法

    我有一个托管在 BitBucket 上的项目 我可以重命名它吗 如果没有 并且我需要创建一个新的存储库 有人可以告诉我最简单的方法吗 并在 BitBucket 上创建新的存储库 令我困惑的一个具体原因是是在本地还是从 bitbucket 网
  • Oracle:设置查询超时

    我有一个 PL SQL 程序 它通过透明网关对 AS400 数据库进行查询 有时AS400不响应查询 可能是网络问题 并且PL SQL程序挂起 有没有什么方法可以为 Oracle 查询设置超时 以便在经过一定时间后出现异常 您是否尝试过设置
  • 如何创建 Java cron 作业 [重复]

    这个问题在这里已经有答案了 我正在编写一个独立的批处理 Java 应用程序来从 YouTube 读取数据 我想设置一个 cron 作业每小时执行某项工作 我搜索并找到了为基本操作执行 cron 作业的方法 但不适用于 Java 应用程序 您
  • 从自定义视图检索继承的属性

    我已经定义了一个父级styleable对于一些自定义视图如下
  • 如何在 F# 中创建作为值类型的 Union 类型?

    普通 F 可区分联合是引用类型 我怎样才能创建一个simple 非递归且仅包含值类型字段 F 中的联合类型是值类型吗 根据一些互联网搜索 我当前 无效 的尝试如下所示
  • 如何在 C# 中获取驱动程序的日期和版本?

    这是我的代码 我可以获取名称 描述 ManagementClass MgmtClass new ManagementClass Win32 SystemDriver foreach ManagementObject mo in MgmtCl
  • C++中的引用

    一 引用的概念 引用不是新定义一个变量 而是给已有变量取一个别名 编译器不会为引用变量开辟内存空间 而和它引用的变量共用一块内存空间 注意 由于C 兼容C 所以 既可以是引用符号 也可以是取地址 int a 0 int b a cout l