研一寒假C++复习笔记--引用的使用

news2024/11/16 7:51:18

​​​​​​​

目录

1--引用的基本语法 

2--引用的注意事项

3--在函数参数中使用引用

4--引用作函数的返回值

5--引用的本质

6--常量引用


1--引用的基本语法 

        引用相当于给变量起别名,其基本语法如下:

数据类型 &别名 = 原名
# include <iostream>

int main(){
    int a = 10;
    int &b = a;

    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;

    b = 100;
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;

    return 0;
}

2--引用的注意事项

        ① 引用必须初始化:例如 int &b; 是错误的,因为没有进行初始化;

        ② 引用一旦初始化后,不能进行更改:例如 int &b = a; 表明b为a的别名,后续不能进行 int &b = c的操作,即不能将b更改为c的别名;

# include <iostream>

int main(){
    int a = 10;
    int &b = a;
    int c = 20;
    b = c; // 赋值操作,而不是更改引用 int &b = c; 才是更改引用,这是不允许的

    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;

    return 0;
}

3--在函数参数中使用引用

        函数传参时,可以利用引用来让形参修饰实参,其优点是可以简化指针来修改实参;

# include <iostream>

// 值传递
void mySwap01(int a, int b){
    int temp = a;
    a = b;
    b = temp;
}

// 地址传递
void mySwap02(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 引用传递
void mySwap03(int &a, int &b){
    int temp = a;
    a = b;
    b = temp;
}

int main(){
    int a = 10, b =20;
    std::cout << "交换前:" << std::endl;
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;

    mySwap01(a, b);
    std::cout << "值传递交换后:" << std::endl;
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;

    mySwap02(&a, &b);
    std::cout << "地址传递交换后:" << std::endl;
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;

    mySwap03(a, b);
    std::cout << "引用传递交换后:" << std::endl;
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;

    return 0;
}

        引用传递的结果为 a = 10, b = 20,这是因为之前已经进行了地址传递,所以再次交换后相当于交换前的数值;

4--引用作函数的返回值

        注意事项:不能返回局部变量的引用,因为局部变量存在于栈区,当函数执行完毕后,局部变量会被操作系统释放;下面的实例中,test01是错误的,而test02是正确的;

int &test01(){
    int a = 10; // 局部变量,存在于栈区
    return a;
}

int &test02(){
    static int a = 10; // 静态变量,存在于全局区
    return a;
}

        如果函数的返回值是引用,这个函数调用可以作为左值;

# include <iostream>

int &test02(){
    static int a = 10; // 静态变量,存在于全局区
    return a;
}

int main(){

    int &ref = test02(); // ref为别名
    std::cout << "ref: " << ref << std::endl;

    test02() = 1000; // = 号的左边为左值
    std::cout << "ref: " << ref << std::endl;
    
}

5--引用的本质

        引用的本质在 C++ 内部实现是一个指针常量;

# include <iostream>

// 当发现是引用时,转换为 int* const ref = &a;
void func(int& ref){
    ref = 100; // ref是引用,转换为*ref = 100;
}

int main(){
    int a = 10;
    // 自动转换为 int* const ref = &a; 指针常量指向不能更改,这也解释了为什么引用不可以更改
    int &ref = a;
    ref = 20;

    std::cout << "a: " << a << std::endl;
    std::cout << "ref: " << ref << std::endl;
    func(a);
    std::cout << "a = " << a << ", ref: " << ref << std::endl;
    return 0;
}

6--常量引用

        常量引用用来修饰形参,防止误操作;通过在函数形参列表中,使用const来修饰形参,从而防止形参改变实参; 

# include <iostream>

void showValue(int &val){
    val = 1000; // 这个是误操作
    std::cout << "val: " << val << std::endl;
}

int main(){
    int a = 10;
    const int &ref1 = a; // 引用必须引用一块合法的内存空间

    const int &ref2 = 20; // 不使用const将报错
    // 使用const相当于:
    // int temp = 20;
    // int &ref2 = temp;
    // 加入const后为只读,不能修改,即ref2 = 30会报错
    
    int b = 20;
    showValue(b);
    std::cout << "b = " << b << std::endl;
    return 0;
}

# include <iostream>

void showValue(const int &val){
    // val = 1000; // 这个是误操作,当使用const之后,如果检测到误操作就会报错
    std::cout << "val: " << val << std::endl;
}

int main(){
    int a = 10;
    const int &ref1 = a; // 引用必须引用一块合法的内存空间

    const int &ref2 = 20; // 不使用const将报错
    // 使用const相当于:
    // int temp = 20;
    // int &ref2 = temp;
    // 加入const后为只读,不能修改,即ref2 = 30会报错

    int b = 20;
    showValue(b);
    std::cout << "b = " << b << std::endl;
    return 0;
}

        在 showvalue() 函数内部,如果没有注释 val = 1000,将出现以下错误,提醒函数内部进行了 const 常量引用的误操作!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统之进程信号

代码存放在&#xff1a;https://github.com/sjmshsh/System-Call-Learn/tree/master/signal 我们先来看一张图&#xff0c;了解一下通过阅读本博客&#xff0c;你可以收获什么。 背景知识 首先我说明一点 信号 ! 信号量 我们这篇文章讲解的是信号&#xff0c;不是信号量 信…

POJ3263. Tallest Cow题解(c++ 前缀和)

POJ3263. Tallest Cow 传送门&#xff1a;Tallest Cow 题目&#xff1a; 有N头牛站成一行。两头作能够相支看见&#xff0c;当且仅当它们中间的牛身高都比它们矮。现在&#xff0c;我们只知道其中最高的牛是第P头&#xff0c;它的身高是H&#xff0c;不知道剩余N-1头牛的身高。…

大数据之Kafka高级知识点

文章目录前言一、分片和副本机制&#xff08;一&#xff09;分片机制&#xff08;二&#xff09;副本二、Kafka如何保证数据不丢失&#xff08;一&#xff09;Producer生产者&#xff08;二&#xff09;Broker&#xff08;三&#xff09;Consumer消费者三、消息存储和查询机制总…

重新设计 TCP 协议

看一段关于 TCP 协议的历史讨论&#xff0c;源自&#xff1a;The design philosophy of the DARPA internet protocols 读这段文字时&#xff0c;你可能觉得这不是在谈 TCP&#xff0c;而是在创造一个新协议&#xff0c;但事实上这就是 TCP 在被创造过程中真实的纠结。 现在来…

Java知识点细节简易汇总——(6)面向对象编程(中级部分)

一、IDE快捷键 删除当前行, 默认是 ctrl Y 自己配置 ctrl d复制当前行, 自己配置 ctrl alt 向下光标补全代码 alt /添加注释和取消注释 ctrl / 【第一次是添加注释&#xff0c;第二次是取消注释】导入该行需要的类 先配置 auto import , 然后使用 altenter 即可快速格式化…

Day867.事务隔离 -MySQL实战

事务隔离 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于事务隔离的内容。 提到事务&#xff0c;肯定不陌生&#xff0c;和数据库打交道的时候&#xff0c;总是会用到事务。 最经典的例子就是转账&#xff0c;你要给朋友小王转 100 块钱&#xff0c;而此时你的银行…

[前端笔记——CSS] 10.层叠与继承、选择器

[前端笔记——CSS] 10.层叠与继承、选择器1.层叠与继承1.1 冲突规则1.2 继承1.3 层叠1.4 CSS位置的影响2.选择器2.1 选择器是什么&#xff1f;2.2 选择器列表2.3 选择器的种类类型、类和 ID 选择器标签属性选择器伪类与伪元素运算符选择器参考表1.层叠与继承 1.1 冲突规则 CS…

一起自学SLAM算法:8.1 Gmapping算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 下面将从原理分析、源码解读和安装与运行这3个方面展开讲解Gmapping 算法。 8.1.1 Gmapping原理分析 首先要知道&#xff0c;Gmapping是一种基于粒子滤波的算法。在7.7.2节中已经提到过用RBPF&#xff08;Rao-…

linux系统中使用QT实现APP开发的基本方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何使用QT进行APP的主界面开发的方法。 目录 第一&#xff1a;APP界面开发基本简介 第二&#xff1a;滑动界面实现 第三&#xff1a;APP界面开发实现 第四&#xff1a;APP主界面测试 第一&#xff1a;APP界面开发基本…

ARP渗透与攻防(一)之ARP原理

ARP原理 前言 ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生大量的ARP通信量使网络阻塞&#xff0c;攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目&#xff0c;造成网络中断或中间人攻击。ARP攻击主要是存在…

CSS3基础内容

目录 CSS基本样式 选择器分类 标签选择器 类选择器 利用类选择器画三个盒子 多类名 id选择器 id选择器和类选择器的区别 通配符选择器 CSS字体属性 字体粗细font-weight 字体样式 CSS文本属性 CSS的引入方式 行内样式表&#xff08;行内式&#xff09; 内部样式表…

2023年集卡活动简记

文章目录支付宝总评&#xff1a;【强烈推荐】年味浓&#xff0c;必中奖&#xff0c;单倍金额不算少。只关注开奖可以除夕当天玩儿。集卡分1.88元难度&#xff1a;【非常低】必中奖时间投入&#xff1a;【较少】无需打开其他App&#xff0c;比较轻松。操作体验&#xff1a;【好】…

深度理解卷积神经网络

神经网络包括卷积层&#xff0c;池化层&#xff0c;全连接层。一个最简单的神经元结构&#xff0c;假如有三个输入&#xff0c;都对应一个权重参数&#xff0c;然后通过权重加起来&#xff0c;经过一个激活函数&#xff0c;最后输出y。CNN中独特的结构就是卷积层&#xff0c;就…

拓展:阿里巴巴中文站架构演进分析【部分】

文章目录前言阿里巴巴中文站架构发展历程阿里巴巴第五代架构数据架构的复杂前言 由学习整理而来&#xff0c;并非有意抄袭。如果有冒犯行为&#xff0c;请及时联系作者进行处理&#xff01; 阿里巴巴中文站架构发展历程 时间关键技术1999第一代网站架构Perl&#xff0c;CGl&…

【实操案例八】元组、集合操作 实例代码及运行效果图!

任务一&#xff1a;我的咖啡馆你做主 方法一&#xff1a;使用列表 # 任务一&#xff1a;我的咖啡馆你做主 # 方法一&#xff1a;使用列表lst[蓝山,卡布奇诺,拿铁,皇家咖啡,女王咖啡,美丽与哀愁]for i in lst:print(lst.index(i)1,.,i,end\t) print()while True:chice int(in…

SpringCloud+Ribbon 报错:java.net.unknownhostexception:XXX

SpringCloudRibbon 报错&#xff1a;java.net.unknownhostexception:XXX 问题分析&#xff1a; 网上很多的说法是依赖冲突导致&#xff0c;原因是什么呢&#xff1a;如果你的org.springframework.cloud:spring-cloud-starter-netflix-eureka-client 依赖中包含了ribbon依赖&…

常用JVM配置参数简介

既然学习JVM&#xff0c;阅读GC日志是处理Java虚拟机内存问题的基础技能&#xff0c;它只是一些人为确定的规则&#xff0c;没有太多技术含量。 既然如此&#xff0c;那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。 &#xff08;1&#xff09;如果你用的是…

Elasticsearch7.8.0版本高级查询—— 分页查询文档

目录一、初始化文档数据二、分页查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; { "name":"zhangsan", "ag…

数据分析-深度学习 Pytorch Day8

一。什么是循环神经网络&#xff1a;循环神经网络&#xff08;Rerrent Neural Network, RNN&#xff09;&#xff0c;历史啊&#xff0c;谁发明的都不重要&#xff0c;说了你也记不住&#xff0c;你只要记住RNN是神经网络的一种&#xff0c;类似的还有深度神经网络DNN&#xff…

广州周立功CanTest卡使用教程一

网上有不少Can采集平台,包括Ardunio,Can卡,也有不少人用Freescale自己DIY一个平台,这些都是相当不错,并且都有成熟的代码,这里介绍在汽车诊断软件领域普遍都会选择的Can卡使用。 大家是不是对这个节面非常熟悉,CAN-bus 通用测试软件是一个专门用来对所有的 ZLGCAN 系列板…