C++基础入门之引用

目录

一.引用

1.1引用和取地址

1.2 别名和原名的区别

1.3 引用的用法

1.31 做参数

1.311 输出型参数:形参改变实参

 1.312 可以减少拷贝,增加效率

1.32 引用的约定

 1. 引用必须初始化

 2. 引用定义后,不能改变指向

4. 给指针取别名

 1.33 引用做返回值

错误示范

传值返回:返回a的拷贝

传引用:返回的是a的别名

 结论:如果返回变量出了作用域(生命周期(局部变量))就销毁,不能使用引用返回。

1.4 引用和指针的区别


一.引用

        引用只是给一个变量重新取了一个名字,取了一个别名,不会给引用重新分配空间。

1.1引用和取地址

引用: 在一个类型的后面加上& 等于一个变量。为取别名

int a = 0;
int& b = a;

取地址:在一个变量前面加上&

cout << &b << endl

1.2 别名和原名的区别

别名=原名。鲁迅就是周树人,他们是等价的,所以对其中一个++,他们都++,所以他们输出的结果是一样的。

int a =0;
int& b =a;
cout << &b <<endl;
cout << &a <<endl;
b++;
a++;

  1.  别名可以有多个。
  2.  可以给别名取别名。

1.3 引用的用法

1.31 做参数

1.311 输出型参数:形参改变实参

例如交换两个数的函数,在C语言中,由于形参是实参的拷贝,所以如果想让形参改变实参就要传地址,然后形参用指针接收

void swap(int* a,int* b)
{
    ...
}
int main()
{
    int x =5;
    int y =6;
    swap(&x,&y);
}

在C++里就不用,直接用别名,因为别名就等价于原名,对别名的改变就等于改变原名

void swap(int& a,int& b)
{
    int tmp = a;
    a = b;
    b =tmp;
}
int main()
{
    int x =5;
    int y =6;
    swap(x,y);
}
 1.312 可以减少拷贝,增加效率

1.32 引用的约定

1. 引用必须初始化

2. 引用定义后,不能改变指向

3. 一个变量可以有多个别名

4. 也可以给指针取别名

 1. 引用必须初始化
int a = 0;
int &b = a;

下面是错误代码,因为引用必须初始化。

int a = 0;
int &b;
b = c;
 2. 引用定义后,不能改变指向
int a = 0;
int &b = a;
int c = 2;
b = c;     //这里不是改变指向,而是将C的值赋给b

 这里b是a的别名,b = c 不是将b的指向从a变为c,而是将C的值赋给b。这是因为引用的指向不能改变。

4. 给指针取别名

 下面是C语言写法

void PushBack(struct Node** pphead,int x)
{
    *pphead = newnode;
}
int main()
{
    Struct Node * plist =NULL;
   PushBack(&plist,1);
}

C++写法,可以对指针取别名

void PushBack(int*& phead,int x)
{

}
int main()
{
    Struct Node * plist =NULL;
   PushBack(&plist,1);
}

 1.33 引用做返回值

错误示范
传值返回:返回a的拷贝

下面代码虽然调用了函数,但是并不能返回0;

这就涉及到函数栈帧的问题。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

int func()
{
	int a = 0;
	return a;
}
int main()
{
	int ret = func();
	cout << ret << endl;
	return 0;
}

第一步给主函数创建栈帧,然后是给局部变量ret创建栈帧,再是调用函数func,第四步 是给func创建栈帧,第五步给局部变量a创建栈帧,第六步返回return,但是由于a是局部变量,所以a出了作用域栈帧就销毁了,所以return的将不会是a的值。

 

传引用:返回的是a的别名

 这是& func会是野引用。返回也不是0,而是a的别名,结果是返回一个随机值。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

int& func()
{
	int a = 0;
	return a;
}
int main()
{
	int ret = func();
	cout << ret << endl;
	return 0;
}
 结论:如果返回变量出了作用域(生命周期(局部变量))就销毁,不能使用引用返回。

1.4 引用和指针的区别

  1.  引用大部分功能是一样的,但是引用不能完全代替指针。
  2. 引用不能代替指针的原因就是:引用的指向不能改变,但是指针可以
    1. 例如:链表,二叉树等,插入删除。他们的插入删除,涉及到next域的传递改变指向。

 

1.5 可以用引用返回的情况

 返回变量如果出了作用域生命周期就会销毁(即局部变量),不能用引用返回。

可以用引用返回的情况

 全局变量/静态变量(static)/堆上变量等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/382729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『运维备忘录』之 HTTP 响应状态码速查

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

4核8g服务器能支持多少人访问?- 腾讯云

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

2024年【上海市安全员C3证】考试及上海市安全员C3证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【上海市安全员C3证】考试及上海市安全员C3证新版试题&#xff0c;包含上海市安全员C3证考试答案和解析及上海市安全员C3证新版试题练习。安全生产模拟考试一点通结合国家上海市安全员C3证考试最新大纲及上海市…

计算机毕业设计基于的农村蔬菜销售系统SSM

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; vue mybatis Maven mysql5.7或8.0等等组成&#xff0c;B…

云计算运维 · 第三阶段 · 代码上线案例

学习b记 第三阶段 持续集成案例 这一章做一个小的案例&#xff0c;git、gitlab、jenkins、sonarqube、maven、shell把这周学的一整个流程串联起来做一个完整的代码发布流程案例&#xff0c;这一部分东西比较多&#xff0c;相对于之前的笔记这个会做的仔细一点。#嘿嘿回家就是…

「数据结构」二叉搜索树1:实现BST

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现BST &#x1f349;二叉搜索树的性质&#x1f349;实现二叉搜索树&#x1f34c;插入&#x1f34c;查找&#x1f34c;删除 &am…

FPGA开发

Quartus13.0使用 编译下载&#xff1a; 添加引脚&#xff1a; # ---------------- LED ---------------- # set_location_assignment PIN_K2 -to led_out[11] set_location_assignment PIN_J1 -to led_out[10] set_location_assignment PIN_J2 -to led_out[9] set_locatio…

SRS视频服务器使用记录

SRS是一个开源的&#xff08;MIT协议&#xff09;简单高效的实时视频服务器&#xff0c;支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等协议。 SRS媒体服务器和FFmpeg、OBS、VLC、 WebRTC等客户端配合使用&#xff0c;提供流的接收和分发的能力&#xff0c;是一个…

Python操作MySQL基础

除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库。在Python中&#xff0c;使用第三方库: pymysql来完成对MySQL数据库的操作。 安装第三方库pymysql 使用命令行,进入cmd&#xff0c;输入命令pip install pymysql. 创建到MySQL的数据库连接…

【漏洞复现】多语言药房管理系统MPMS文件上传漏洞

Nx01 产品简介 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0c;并根据到期、产品等各种参数提供各种报告。 Nx02 漏洞描述 …

详细了解ref和reactive.

这几天看到好多文章标题都是类似于&#xff1a; 不用 ref 的 xx 个理由不用 reactive 的 xx 个理由历数 ref 的 xx 宗罪 我就很不解&#xff0c;到底是什么原因导致有这两批人&#xff1a; 抵触 ref 的人抵触 reactive 的人 看了这些文章&#xff0c;我可以总结出他们的想法…

第8章 智能租房——列表页

学习目标 掌握搜索房源列表页展示功能的逻辑&#xff0c;能够实现在列表中展示符合搜索条件的房源数据 掌握最新房源列表页展示功能的逻辑&#xff0c;能够运用分页插件以分页形式展示最新房源数据 掌握热点房源列表页展示功能的逻辑&#xff0c;能够运用分页插件以分页形式展…

Linux文本三剑客(2)

文章目录 一、Linux文本三剑客之awk使用方法awk 的原理实例一&#xff1a;只查看test.txt文件&#xff08;100行&#xff09;内第20到第30行的内容&#xff08;企业面试&#xff09;实例二&#xff1a;已知test.txt文件内容为 BEGIN 和 END 模块实例一&#xff1a;统计/etc/pas…

【单片机】简单的自定义延时程序设计(代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

2、6作业

TCP和UDP的区别 TCP和UDP都是通信协议 TCP提供有连接的&#xff0c;稳定的&#xff0c;无误码无失真无乱序无丢失的通信 UDP提供无连接的&#xff0c;尽力的&#xff0c;可能误码可能乱序&#xff0c;可能丢失的通信 TCP每发一个数据包就需要对方回应一个应答包&#xff0c…

C++重新入门-C++判断语句

目录 1.if语句 嵌套 if 语句 2.switch语句 工作原理 语法 示例 3.三元运算符 示例 注意事项 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&…

Rust基础拾遗--核心功能

Rust基础拾遗 前言1.所有权与移动1.1 所有权 2.引用3.特型与泛型简介3.1 使用特型3.2 特型对象3.3 泛型函数与类型参数 4.实用工具特型5.闭包 前言 通过Rust程序设计-第二版笔记的形式对Rust相关重点知识进行汇总&#xff0c;读者通读此系列文章就可以轻松的把该语言基础捡起来…

推荐知识付费源码,梦想贩卖机升级版

梦想贩卖机升级版&#xff0c;变现宝吸收了资源变现类产品的许多优势&#xff0c;并剔除了那些无关紧要的元素&#xff0c;使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 演示地址&#xff1a;runruncode.com/rjcx/19689.html

电商小程序03登录页面开发

目录 1 创建应用2 创建页面3 首页功能搭建4 登录页搭建5 设置叠加效果总结 小程序开发在经过需求分析和数据源设计之后&#xff0c;就可以进入到页面开发的阶段了。首先我们需要开发登录的功能。 登录功能要求用户输入用户名和密码&#xff0c;勾选同意用户协议和隐私协议&…

第77讲用户管理功能实现

用户管理功能实现 前端&#xff1a; views/user/index.vue <template><el-card><el-row :gutter"20" class"header"><el-col :span"7"><el-input placeholder"请输入用户昵称..." clearable v-model"…