C++中的引用

简介: C++中的引用

什么是引用

引用这个概念听起来吓人,给人一种很难懂难过的一种感觉,但是没什么好害怕的。引用其实就是给我们的变量起了个小名而已,作用就是给变量起别名,并不是创建一块新的内存空间。

结构:数据类型 &别名 = 原名。

引用并不是新开辟了一块空间,只不过是给这个变量起另外一个名字,我们可以通过这个名字来操控这个变量所指向的那块空间。

我们直接来举个例子就好理解了:

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


来看看a和b的地址相不相同,请看:

1.png


我们发现a和b的地址完全相同。

2.png


引用的注意事项

引用的类型必须是与实体类型保持一致。

引用必须初始化。

引用在初始化就后不可以改变。

还是来举个例子:


#include<iostream>
using namespace std;
int main()
{
  int a = 10;
  int b = 20;
  //int &c;这种写法是错误的,因为引用必须进行初始化
  int& c = a;//引用一但初始化,就不可以更改
  c = b;//这是赋值操作,并不是更改利用,这句话的意思是把20赋值给c所指向的那块内存,
  //由于c是a的引用,所以a的内容也会跟着一起改变
  cout << "a=" << a << endl;
  cout << "b=" << b << endl;
  cout << "c=" << c << endl;
  return 0;
}

3.png

4.png

引用做函数参数

我们在学习之前C语言的函数参数时,有两种函数参数传递的方式:一种是值传递,另外一种就是址传递。

现在,我们来学习第三种函数参数的传递方式:引用传递。其实,在C++中,所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。


#include<iostream>
using namespace std;
void swap(int& a, int& b)
{
  int tmp = a;
  a = b;
  b = tmp;
}
int main()
{
  int a = 10;
  int b = 20;
  swap(a, b);
  cout << "a= " << a << endl;
  cout << "b= " << b << endl;
  return 0;
}

5.png


引用做函数返回值

引用做函数参数这里主要由两个点:

1.不要返回局部变量的引用。

2.函数的调用可以作为左值。

我们先来看第一种:不要返回局部变量的引用。

//不要返回局部变量的引用
#include<iostream>
using namespace std;
int& test1()
{
  int a = 10;
  return a;
}
int main()
{
  int& ret = test1();
  cout << "ret= " << ret << endl;
  return 0;
}

6.png

我们知道,局部变量存储在栈区中,一旦出了作用域就会被销毁。

因为a的内存已经释放了,此时我们如果再去访问a的内存就已经是非法操作了。所以说,局部变量存放在栈区中,不要返回局部变量的引用。

现在我们来看第二点:函数的调用可以作为左值。

在这之前,我们要知道static关键字的用法,static修饰的局部变量会变为静态变量,而静态变量会存放在全局区,会提高生命周期。而放在全局区中的的数据在程序结束后是由系统释放的。

请看:

//返回静态变量引用
#include<iostream>
using namespace std;
int& test2()
{
  static int a = 10;
  return a;
}
int main()
{
  int& ret2 = test2();
  cout << "ret2 = " << ret2 << endl;
  return 0;
}

7.png

函数的调用可以作为左值


//函数的调用可以作为左值
#include<iostream>
using namespace std;
int& test2()
{
  static int a = 10;
  return a;
}
int main()
{
  int& ret2 = test2();
  cout << "ret2 = " << ret2 << endl;
  test2() = 1000;//如果函数的返回值是引用,这个函数调用可以作为左值
  cout << "ret2 = " << ret2 << endl;
  return 0;
}

8.png


引用的本质

接下来我们来探索引用的本质。

本质:引用的本质其实就是一个指针常量。

指针常量就是这个指针的指向不可以进行更改,但是指针指向的内容是可以进行更改的。

所以也就有了引用一旦初始化后,就不可以进行改变,这里的不可进行改变指的就是指针的指向不可以进行改变。

请看代码举例:


//引用的本质
#include<iostream>
using namespace std;
void fun(int& ret)
{
  ret = 200;
  //由于ret是引用,所以会自动转换为*ret=200
}
int main()
{
  int a = 10;
  int& ret = a;
  //自动转换为int* const ref = &a;
  //指针常量就是指针的指向不可以进行更改,这也就是为什么引用一旦进行初始化就不可以进行过更改
  ret = 20;//内部发现ret是引用,内部会自动转换为*ret=20
  cout << "a = " << a << endl;
  cout << "ret = " << ret << endl;
  fun(a);
  cout << "a = " << a << endl;
  cout << "ret = " << ret << endl;
  return 0;
}

9.png

好了,以上就是引用的一些最基本的理解了。就到这里吧,再见啦各位!!!

目录
相关文章
|
2月前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
43 1
|
3月前
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
45 2
|
21天前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
16 3
|
1月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
2月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
47 5
|
2月前
|
C++
C++引用
C++引用
13 1
|
2月前
|
存储 安全 编译器
【C++入门】—— C++入门 (中)_引用
【C++入门】—— C++入门 (中)_引用
27 5
|
2月前
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
1月前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。