C++入门基础(三)

embedded/2024/11/14 21:13:25/

目录

  • 引用
    • 引用概念
    • 例子1
    • 例子2
    • 例子3
    • 例子4
    • 常引用
      • 拓展

引用

引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。
在这里插入图片描述

比如:同学A有一个别名为张三,张三是同学A,张三和同学A指的都是同一个人,在C++中同学A可能是int类型,也可能是char类型,甚至可能是int*类型或int**类型…

因为引用的符号和去地址符号是相同的,就像之前的左移操作符和流插入一样,所以C++是可以同时支持取地址和引用的

例子1

#include<iostream>
using namespace std;
int main()
{int a = 0;int& b = a;cout << &b << endl;cout << b << endl;
}

在这里插入图片描述

这段代码中&b=a表示b是a的别名,打印的时候
cout<<&b<<endl表示打印a别名的地址
cout<<b<<endl则表示打印a的别名
注意:引用类型必须和引用实体是同种类型的

b既然是a的别名,b的地址也应该和a的地址一样(因为都表示的是同一个人)
在这里插入图片描述

那如果更改b的值,a的值是否又会更改呢?

在这里插入图片描述

显然是可以的,因为b就是a,只是换了个名字而已

例子2

别名是可以无限取的,就跟一个人的外号一样,不一定只有一个外号,同时也可以给一个人的外号取别名,比如同学B叫同学A为张三,同学C叫同学A为张四,有时同学C也爱叫张四为张五

	int main(){int a = 0;int& b = a;int& c = b;int& d = a;cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;return 0;}

在这里插入图片描述

例子3

对一个人取外号,这个人必须是存在的,所以引用在定义时必须初始化

在这里插入图片描述
如果我们写int &a=0,这样会被认为a是一个地址
在这里插入图片描述

例子4

一个变量可以有多个别名,而一个别名是不可以是多个变量的

	int main(){int a = 0;int c = 1;int& b=a;int& b = c;return 0;}

在这里插入图片描述
再来看看下面这段代码

	int main(){int a = 0;int& b = a;int c = 2;b = c;cout << b << endl;cout << a << endl;return 0;}

在这里插入图片描述

这里的b并不是c的别名,之前是 int& b = c,这里是b=c,只是将c对值赋值给b,但是b不是c的别名

常引用

常引用的出现是为了解决当引用作为参数传参时被修改的情况

void func(int& x)
{x++;
}
int main()
{int a = 0;int& b = a;b++;cout << a << endl;func(a);cout << a << endl;
}

这里的b作为a的别名,通过引用传参传进func函数中,func函数的x也是a的别名,所以x++,影响到了函数外的a
在这里插入图片描述
为了解决这种情况,可以用const去修饰
在这里插入图片描述
const修饰使参数的权限变小,让x不能被修改,但是可以给其他变量赋值
在这里插入图片描述
下面三张图也是因为const修饰引起的权限问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

coust修饰的int对象可以和其他coust修饰的int对象相加,因为权限都相同
在这里插入图片描述
所以可以得出结论,权限是不能放大的
比如下面的代码,我们对a进行const修饰,然后将a通过引用传参传给func函数中,最后会报错

void func( int& x)
{;
}
int main()
{const int a= 1;func(a);}

在这里插入图片描述
而当我们对func函数中的x用const修饰后就可以正常运行了,这是因为xa是被const修饰的,所以是不可以被更改的,而x作为a的别名理应也不可以被修改,但是x没有被const修饰,导致权限放大,所以才会报错
在这里插入图片描述

拓展

我们知道double类型传给int类型的时候会出现数据丢失,当我们用int类型的ri作为d的别名是会报错
在这里插入图片描述
但是当在int &ri前加const修饰后却可以正常运行
在这里插入图片描述
这里就需要知道类型转换的时候会产生临时变量,也就是说并不是d直接赋值给ri,而是通过d构造出一个int类型的临时变量
所以这里的ri是临时变量的别名,而我们知道临时变量是具有常性的,在没有const修饰的情况下是出现了权限放大,导致出错,而加上了const修饰后权限就相等了,所以没有报错
在这里插入图片描述
那为什么要产生临时变量呢?

int main()
{int i = 97;char ch = 'a';if (i == ch){cout << "i=ch" << endl;}}

当操作符两边的操作数类型不相等时会出现类型提升或者截断,像上边的const int&ri=d是将d整形的部分截断给临时变量,然后ri再去拷贝临时变量

而这里的char ch = 'a’是类型的提升,因为ch只占1个字节,而i是整形占4个字节,所以临时变量会占4个字节,将ch给临时变量,然后临时变量按类型提升的规则,最高位往上补0,最后ch的ASCLL码值和i相同,所以打印出i=ch
在这里插入图片描述


http://www.ppmy.cn/embedded/136409.html

相关文章

【Golang】Go语言教程

Go语言教程 文章目录 Go语言教程一、Go语言教程二、Go语言特色三、Go语言用途四、第一个Go程序六、运行代码的两种方式七、go run和go buil的区别7.1、go run7.2、Go build 一、Go语言教程 Go全称Golang Go是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变…

Scrapy框架:Python爬虫开发快速入门与初试

在众多编程语言中&#xff0c;Python以其简洁的语法和强大的库支持&#xff0c;成为了编写爬虫的首选语言。而在Python的爬虫库中&#xff0c;Scrapy框架无疑是其中的佼佼者。Scrapy是一个开源的、基于Python的爬虫框架&#xff0c;它提供了一套完整的工具和功能&#xff0c;使…

PICO+Unity MR空间锚点

官方链接&#xff1a;空间锚点 | PICO 开发者平台 注意&#xff1a;该功能只能打包成APK在PICO 4 Ultra上真机运行&#xff0c;无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上&#xff0c;勾选…

贪心算法习题其三【力扣】【算法学习day.20】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

【前端】Svelte:生命周期函数

Svelte 提供了一些强大的生命周期函数&#xff0c;用于管理组件的生命周期。借助这些函数&#xff0c;我们可以在组件的不同状态执行代码&#xff0c;方便控制组件的创建、更新和销毁行为。主要的生命周期函数包括 onMount、beforeUpdate、afterUpdate 和 onDestroy。 本文将通…

Linux设置jar包开机自启

创建启动脚本 在/etc/rc.d/init.d目录下创建**.sh脚本文件&#xff0c;这里起名为jarStartUp.sh 文件中复制以下内容 # 配置jdk的路径&#xff08;jdk的环境变量&#xff0c;可以使用more /etc/profile命令获取copy路径&#xff09; export JAVA_HOME/usr/local/java/jdk1.…

【鉴权】深入探讨 Session:服务器端存储用户状态的机制

目录 引言一、Session 的定义与概念1.1 什么是 Session&#xff1f;1.2 Session 工作流程1.3 Session 工作原理图示 二、Session 的基本结构2.1 Session ID2.2 Session Data 三、Session 的优缺点四、Session 的生命周期与安全性4.1 Session 的生命周期4.1.1 会话创建4.1.2 会话…

JAVA题目笔记(十三) 爬虫

一、网络爬取 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.regex.Matcher; import java.util.regex.Pattern;public class Main {public static v…