part01-引用

Posted flying_1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了part01-引用相关的知识,希望对你有一定的参考价值。

目录

一、概念

1>基础定义

2>引用作为函数的返回值

3>常引用

4>附件餐


一、概念

1>基础定义

类型名 & 引用名 = 变量名;

上面这个写法就定义了一个变量名的引用。

举个例子:

int x = 0;

int & y = x;

此时 y 引用了x, y的类型是int &

变量的引用就等价于这个变量,简单来说,y就是x的别名。

举个代码例子,如下一目了然

#include<iostream>
using namespace std;

int main()
    int x = 3;
    int & y = x;
    cout << y; // 3
    cout << x; // 3
    y = 5;
    cout << x; // 5
    return 0;

注意📢,引用需要注意三点

  1. 定义时,一定要初始化成某个变量,比如上面的例子y是引用的x
  2. 引用从一而终!y生是x的引用,死也是x的引用,不会在引用别的变量了
  3. 引用时只能引用变量,不能引用常量和表达式

ok,了解了注意的三点,看个例子加深理解

int a=1,b=2;
int & x = a;
int & y = x;// 此时x和y都引用了a
y = 10;
cout << a << endl; //10
y = b;
cout << a << endl; //2

上面的例子需要稍微理解的是,当y=b的时候,此时是赋值,b的值给了y,但是y还是a的引用,所以此时a打印是2.

例题1.1

下面程序片段输出结果是什么?(答案会公布在评论区)

int a = 1,b = 2;
int & r = a;
r = b;
r = 7;
cout << a << endl;

nice,恭喜各位已经对引用小有了解,那么接下来,带大家一起看一个简单的实战,让大家了解一下引用的妙处。

大家回忆一下,在c语言中,交换两个变量的值的函数如何写?如下

void swap(int* a, int* b)
    int tmp; 
    tmp = *a; *a = *b; *b = tmp;

int x,y;
swap(&x,&y)

上面的代码是c实现x和y交换值的代码,是不是比较繁琐?再一起看看c++的引用

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

int x,y;
swap(x,y)

上面的写法是不是看上去清爽许多。

2>引用作为函数的返回值

int x =3;
int & SetValue()  return x;
int main()
    SetValue() = 10;
    cout << x; //10
    return 0;

SetValue函数的返回值是引用,同时,这个引用了全局变量x,所以赋值的操作,就等于对x的赋值;这里埋一个坑,大家肯定会有人思考,为什么要把函数写在赋值号左边?这个操作有什么意义呢?莫急,待后面的章节中,和大家一起升级打怪后,会填坑的!

3>常引用

定义引用时,前加const关键字,就是常引用

int x;

const int & y = x;

y的类型就是const int &;是不是感觉很熟悉

那么它的作用是什么呢?就是不能通过修改常引用去修改引用的值;直白点借用上面的例子说就是,你不能通过给y赋值,来修改x的值,如下:

int x=3;
const int & y=x;
y=200;//编译直接报错
x=200;//ok

4>附件餐

说一个工作中可能会遇到的的类似情况

常引用和非常引用的转换问题,const T & 和 const T是不同的类型,重要的是重复三遍哈!!!

T & 类型的引用或者T类型的变量可以用来初始化const T & 类型的引用

但是,const T & 类型的引用或者const T类型的常变量可以用来初始化 T & 类型的引用,除非进行强制类型转换。

例题1.2

下面程序片段哪个正确?(答案会公布在评论区)

A) 	int n = 4;
	int & r = n * 5;

B) 	int n = 6;
	const int & r = n;
	r = 7;

C)	int n = 8;
	const int & r1 = n;
	int & r2 = r1;

D) 	int n = 8;
	int & r1 = n;
	const int r2 = r1;

好了,今天关于引用的部分就到此结束了哈,小白成神之路,刚刚开始~

以上是关于part01-引用的主要内容,如果未能解决你的问题,请参考以下文章

Go语言开发-(Part01)

part01.03 委托与 Lambda 表达式:委托

分析之分析类图—知识篇Part06(202205更新)

CUDA C Programming Guide 在线教程学习笔记 Part 2

Luogu5816 内部白点(扫描线)题解

BZOJ 1818 内部白点(离散化+树状数组)