C++ · 代码笔记3 · 引用

目录

  • 前言
  • 011引用初探_引用与普通变量
  • 012引用初探_引用作为函数参数
  • 013引用初探_引用作为函数返回值
  • 014引用初探_引用返回局部函数造成的错误
  • 015引用初探_多级引用
  • 020引用与指针递增的区别
  • 030const与引用
  • 040使用const限定的函数形参引用

前言

  本笔记所涉及到的编程环境与 《C++ · 代码笔记1 · 从C到C++》 中的编程环境一致,具体可参考此笔记。

011引用初探_引用与普通变量

  相关代码:

#include <iostream>int main()
{int a = 99;                               // 定义整型变量a并初始化为99int &r = a;                               // 定义整型引用r并初始化为a的引用std::cout << a << ", " << r << std::endl; // 输出a的值和r的值,由于r是a的引用,所以它们的值相同std::cout << &a << std::endl;             // 输出a的地址std::cout << &r << std::endl;             // 输出r的地址,由于r是a的引用,所以它们的地址也相同return 0;
}

  运行结果:

在这里插入图片描述

012引用初探_引用作为函数参数

  相关代码:

#include <iostream>/*** 函数swap1:值传递方式交换两个整数* @param a 第一个整数* @param b 第二个整数* 注意:此函数不会改变实参的值,因为它是通过值传递的*/
void swap1(int a, int b)
{int temp = a; // 使用临时变量保存a的值a = b;        // 将a的值设置为bb = temp;     // 将b的值设置为a原始的值
}/*** 函数swap2:指针传递方式交换两个整数* @param p1 指向第一个整数的指针* @param p2 指向第二个整数的指针* 注意:此函数会改变实参的值,因为它是通过指针传递的*/
void swap2(int *p1, int *p2)
{int temp = *p1; // 使用临时变量保存p1指向的值*p1 = *p2;      // 将p1指向的值设置为p2指向的值*p2 = temp;     // 将p2指向的值设置为p1原始的值
}/*** 函数swap3:引用传递方式交换两个整数* @param r1 第一个整数的引用* @param r2 第二个整数的引用* 注意:此函数会改变实参的值,因为它是通过引用传递的*/
void swap3(int &r1, int &r2)
{int temp = r1; // 使用临时变量保存r1的值r1 = r2;       // 将r1的值设置为r2r2 = temp;     // 将r2的值设置为r1原始的值
}int main()
{int num1, num2;std::cout << "值传递,请输入两个整型数据: ";std::cin >> num1 >> num2;swap1(num1, num2);std::cout << num1 << " " << num2 << std::endl;std::cout << "指针传递,请输入两个整型数据: ";std::cin >> num1 >> num2;swap2(&num1, &num2);std::cout << num1 << " " << num2 << std::endl;std::cout << "引用传递,请输入两个整型数据: ";std::cin >> num1 >> num2;swap3(num1, num2);std::cout << num1 << " " << num2 << std::endl;return 0;
}

  运行结果:

在这里插入图片描述

013引用初探_引用作为函数返回值

  相关代码:

#include <iostream>
using namespace std;/*** 函数func:通过引用修改参数并返回引用* @param r 输入的整型引用参数* @return 返回修改后的整型引用* 注意:此函数通过引用修改传入的参数,并且返回修改后的引用*/
int &func(int &r)
{r += 10;  // 将传入的引用参数的值增加10return r; // 返回修改后的引用参数
}int main()
{int num1 = 10;         // 定义并初始化整型变量num1为10int num2 = func(num1); // 调用func函数,传入num1的引用,并将返回的引用赋值给num2// 此时num1和num2的值都为20,因为它们引用的是同一个变量cout << num1 << " " << num2 << endl; // 输出num1和num2的值return 0;
}

  运行结果:

在这里插入图片描述

014引用初探_引用返回局部函数造成的错误

  相关代码:

#include <iostream>
using namespace std;/*** 函数plus10:计算输入整型引用参数加10的结果,并返回一个新的整型引用* @param r 输入的整型引用参数* @return 返回一个新的整型引用,其值为输入参数加10* 注意:此函数返回的是一个局部变量的引用,这是一个危险的操作,* 因为局部变量在函数调用结束后会被销毁,返回其引用可能会导致未定义行为。*/
int &plus10(int &r)
{int m = r + 10; // 创建一个局部变量m,其值为输入参数r加10return m;       // 返回局部变量m的引用
}int main()
{int num1 = 10;           // 定义并初始化整型变量num1为10int num2 = plus10(num1); // 调用plus10函数,返回的是一个局部变量的值,此处是安全的cout << num2 << endl;    // 输出num2的值,即20int &num3 = plus10(num1); // 调用plus10函数,返回局部变量的引用并赋值给num3// 这里是危险的,因为num3现在引用了一个已经销毁的局部变量int &num4 = plus10(num3); // 再次调用plus10函数,返回局部变量的引用并赋值给num4// 这里同样是危险的,因为num4现在引用了一个已经销毁的局部变量cout << num3 << " " << num4 << endl; // 输出num3和num4的值,这是未定义行为return 0; // 程序结束,返回0
}

  运行结果:
在这里插入图片描述
  简单解释:事实上在编译的时候编译器已经发出了警告,其内容为返回了一个局部变量的引用。这是一个错误,因为局部变量在函数返回后就会销毁,返回的引用将指向一个不再有效的内存位置。

  在运行的时候直接出现“段错误”,从此可以看出,绝对不要使用引用去返回一个局部变量,否则将会出现程序崩溃的后果。

015引用初探_多级引用

  相关代码:

#include <iostream>int main(int argc, char const *argv[])
{int a = 10;  // 定义整型变量a并初始化为10int &r = a;  // 定义整型引用r,并初始化为a的引用int &rr = r; // 定义整型引用rr,并初始化为r的引用,即rr也是a的引用// 输出rr、r和a的值,由于rr和r都是a的引用,它们的值与a相同std::cout << "rr = " << rr << "\nr = " << r << "\na = " << a << std::endl;return 0;
}

  运行结果:
在这里插入图片描述

020引用与指针递增的区别

  相关代码:

#include <iostream>
using namespace std;int main(int argc, char const *argv[])
{int a = 10;        // 定义整型变量a并初始化为10int &r = a;        // 定义整型引用r,并初始化为a的引用r++;               // 通过引用r增加a的值std::cout << r << std::endl; // 输出r的值,即a的值,现在是11int arr[2] = {27, 84}; // 定义并初始化一个整型数组arr,包含两个元素27和84int *p = arr;          // 定义一个整型指针p,并初始化为指向数组arr的首地址p++;                   // 将指针p向后移动一个位置,指向数组arr的第二个元素std::cout << *p << std::endl;    // 输出指针p所指向的值,即数组arr的第二个元素,值为84return 0;
}

  运行结果:

在这里插入图片描述

030const与引用

  相关代码:

#include <iostream>/* 引用不能绑定到临时数据,但是当使用 const 关键字对引用加以限定后,引用就可以绑定到临时数据了。 */// 定义一个结构体S,包含两个整型成员a和b
typedef struct
{int a; // 成员aint b; // 成员b
} S;// 函数func_int,返回一个整型值100
int func_int()
{int n = 100; // 初始化整型变量n为100return n;    // 返回n的值
}// 函数func_s,返回一个结构体S的实例,其成员a和b分别被赋值为100和200
S func_s()
{S a;       // 定义结构体变量aa.a = 100; // 设置a的成员a为100a.b = 200; // 设置a的成员b为200return a;  // 返回结构体变量a
}// 重载+运算符,用于两个结构体S的实例相加
S operator+(const S &A, const S &B)
{S C;             // 定义结构体变量C,用于存储A和B相加的结果C.a = A.a + B.a; // 设置C的成员a为A和B的成员a之和C.b = A.b + B.b; // 设置C的成员b为A和B的成员b之和return C;        // 返回结构体变量C
}// 程序的入口点
int main()
{int m = 100, n = 36; // 定义并初始化整型变量m为100,n为36// 以下都是通过字面量或表达式初始化的常量引用,注意它们都没有实际的对象与之绑定const int &r1 = m + n;      // 常量引用r1绑定到m和n的和上const int &r2 = m + 28;     // 常量引用r2绑定到m和28的和上const int &r3 = 12 * 3;     // 常量引用r3绑定到12和3的乘积上const int &r4 = 50;         // 常量引用r4绑定到字面量50上const int &r5 = func_int(); // 常量引用r5绑定到函数func_int的返回值上S s1 = {23, 45}; // 定义并初始化结构体变量s1的成员a为23,b为45S s2 = {90, 75}; // 定义并初始化结构体变量s2的成员a为90,b为75const S &r6 = func_s(); // 常量引用r6绑定到函数func_s的返回值上const S &r7 = s1 + s2;  // 常量引用r7绑定到s1和s2的和上return 0; // 程序结束
}

  运行结果:

在这里插入图片描述

040使用const限定的函数形参引用

  相关代码:

#include <cstdio>// 计算长方体的表面积
// @param len 长方体的长度
// @param width 长方体的宽度
// @param hei 长方体的高度
// @return 返回长方体的表面积
/* 使用 const 能让函数接收 const 和非 const 类型的实参,否则将只能接收非 const 类型的实参; */
double volume(const double &len, const double &width, const double &hei)
{return len * width * 2 + len * hei * 2 + width * hei * 2;
}// 程序的入口点
int main()
{int a = 12, b = 3, c = 20; // 定义并初始化整型变量a为12,b为3,c为20double v1 = volume(a, b, c);                   // 调用volume函数计算长方体的表面积,并存储结果到v1double v2 = volume(10, 20, 30);                // 调用volume函数计算长方体的表面积,并存储结果到v2double v3 = volume(89.4, 32.7, 19);            // 调用volume函数计算长方体的表面积,并存储结果到v3double v4 = volume(a + 12.5, b + 23.4, 16.78); // 调用volume函数计算长方体的表面积,并存储结果到v4double v5 = volume(a + b, a + c, b + c);       // 调用volume函数计算长方体的表面积,并存储结果到v5printf("%lf, %lf, %lf, %lf, %lf\n", v1, v2, v3, v4, v5); // 打印出v1, v2, v3, v4, v5的值return 0;
}

  运行结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么对接迅雷网盘拉新项目?迅雷网盘怎么做才有效果?

自网盘拉新项目上线以来&#xff0c;网盘市场日益繁荣&#xff0c;各大厂商纷纷进军这一领域。头条网盘、悟空网盘、UC网盘、迅雷网盘等都成为了各个推广达人喜欢的推广项目。其中&#xff0c;迅雷网盘凭借其稳定的服务、强大的功能和广泛的用户基础&#xff0c;成为了市场中的…

西门子S120故障报警F30003的解决办法总结

西门子S120故障报警F30003的解决办法总结 如下图所示&#xff0c;压机在回程时突然出现报警&#xff0c;故障代码为&#xff1a;30003&#xff0c; 如下图所示&#xff0c;查找手册可以看到F30003的报警分析为&#xff1a;直流母线欠压 如下图所示&#xff0c;本来想测量输入端…

三八妇女节智慧花店/自动售花机远程视频智能监控解决方案

一、项目背景 国家统计局发布的2023年中国经济年报显示&#xff0c;全年社会消费品零售总额471495亿元&#xff0c;比上年增长7.2%。我国无人零售整体发展迅速&#xff0c;2014年市场规模约为17亿元。无人零售自助终端设备市场规模超过500亿元&#xff0c;年均复合增长率超50%。…

如何阅读“计算机界三大神书”之一 ——《计算机程序的构造和解释》SICP

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

总结Redis的原理

一、为什么要使用Redis 缓解数据库访问压力mysql读请求进行磁盘I/O速度慢&#xff0c;给数据库加Redis缓存&#xff08;参考CPU缓存&#xff09;&#xff0c;将数据缓存在内存中&#xff0c;省略了I/O操作 二、Redis数据管理 2.1 redis数据的删除 定时删除惰性删除内存淘汰…

NHANES数据(复杂调查数据)亚组交互函数1.7(P for interaction)发布-纠正了目前的一个问题

大家好&#xff0c;有粉丝私信我说NHANES数据(复杂调查数据)亚组交互函数1.版本交互函数有点问题&#xff0c;我查看了一下&#xff0c;有个代码调用失效了。就是下面这个&#xff0c;本来我是这样调用数据的 ids<-match.call()$ids应该是由于R版本或者survy包升级后导致这…

基于sprinbgoot的火锅店管理系统(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

从新能源汽车行业自动驾驶技术去看AI的发展未来趋势

自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以及自动驾驶汽车测试与验证技术等。 &#x1f413; 自动驾驶技术 这是AI在汽车行业中应用最广泛的领域之一。自动驾驶技术利用AI算法和传感器来感知环境、识别障碍物&#xff0c…

mysql的语法总结2

命令&#xff1a; mysql -u 用户名 -p mysql登录 命令&#xff1a;create database u1 创建数据库u1 查询数据库 使用数据库u1 创建表department 查询表department ALTER TABLE 表名 操作类型&#xff1b; 操作类型可以有以下的操作&#xff1a; 添加列&#x…

[Redis]——Spring整合Redis(SpringDataRedis)

⭐准备工作&#xff1a; 确保Redis服务已启动idea开发环境 ⭐Redis整合步骤&#xff1a; 1.pom文件引入依赖 2.yml文件配置连接信息 3.修改Redis序列化方式 4.注入RedisTemplate 使用 小知识&#xff1a; Spring整合的Redis可以将Object对象自动序列化成字符串&#xff0…

【C++干货基地】面向对象核心概念 | 访问限定符 | 类域 | 实例化 | 类对象模型

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

【ETCD】简介安装常用操作---图文并茂详细讲解

目录 一 简介 1.1 etcd是什么 1.2. 特点 1.3. 使用场景 1.4 关键字 1.5 工作原理 二 安装 2.1 etcd安装前介绍 2.2 安装 2.3 启动 2.4 创建一个etcd服务 三 常用操作 一 简介 1.1 etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建…

【“双碳”目标】Acrel-2000Z分布式光伏发电监测系统解决方案

1 概述 “十四五”期间&#xff0c;随着“双碳”目标提出及逐步落实&#xff0c;本就呈现出较好发展势头的分布式光伏发展有望大幅提速。就“十四五”光伏发展规划&#xff0c;国家发改委能源研究所可再生能源发展中心副主任陶冶表示&#xff0c;“双碳”目标意味着国家产业结…

百度智能云发布专用向量数据库 VDB 1.0,全新设计内核开启性能狂飙

1 专用向量数据库应对未来业务挑战 向量数据库 向量检索 数据库 向量数据库大致可以分为 2 部分&#xff1a;向量数据的检索&#xff0c;以及向量数据的存储和管理。 向量数据库的性能&#xff0c;比如高 QPS、低延时等&#xff0c;使得业务能够更快的响应用户的查询请求…

神经网络(neural network)

在这一章中我们将进入深度学习算法&#xff0c;学习一些神经网络相关的知识&#xff0c;这些是有更加强大的作用&#xff0c;更加广泛的用途。 神经元和大脑(neurons and the brain): 我们对于我们的编程的进步主要来自我们对于大脑的研究&#xff0c;根据我们对于大脑的研究…

经典排序算法之希尔排序|c++代码实现||什么是希尔排序|如何代码实现

引言 排序算法c实现系列第4弹——希尔排序 算法介绍 希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。该排序算法的基本思想是将原始序列分成若干个子序列&#xf…

Finetuning Large Language Models: Sharon Zhou

Finetuning Large Language Models 课程地址&#xff1a;https://www.deeplearning.ai/short-courses/finetuning-large-language-models/ 本文是学习笔记。 Goal&#xff1a; Learn the fundamentals of finetuning a large language model (LLM). Understand how finetu…

Scrapy与分布式开发(2.3):lxml+xpath基本指令和提取方法详解

lxmlxpath基本指令和提取方法详解 一、XPath简介 XPath&#xff0c;全称为XML Path Language&#xff0c;是一种在XML文档中查找信息的语言。它允许用户通过简单的路径表达式在XML文档中进行导航。XPath不仅适用于XML&#xff0c;还常用于处理HTML文档。 二、基本指令和提取…

pytorch续写tensorboard

模型训练到一半有 bug 停了&#xff0c;可以 resume 继续炼&#xff0c;本篇给出 pytorch 在 resume 训练时续写 tensorboard 的简例&#xff0c;参考 [1-3]&#xff0c;只要保证 writer 接收的 global step 是连着的就行。 Code import numpy as np from torch.utils.tensor…

【node版本问题】运行项目报错 PostCSS received undefined instead of CSS string

最近该项目没有做任何修改&#xff0c;今天运行突然跑不起来报错了 PostCSS received undefined instead of CSS string 【原因】突然想起来期间有换过 node 版本为 16.17.1 【解决】将 node 版本换回之前的 14.18.0 就可以了