一文详解C++中的引用与关键字auto

 更新时间:2023年04月20日 09:32:43   作者:匿名者Unit  
引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。关键字auto一般可以用来自动识别类型,本文主要来讲讲二者的相关知识,需要的可以参考一下

一.引用

1.引用的概念

引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。注意引用的类型必须和变量类型相同,来演示下引用如何使用。

#include <iostream>
using namespace std;

int main()
{
	int a = 1;
	int& b = a;
	int& c = b;
	int& d = c;
	
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	cout << &d << endl;

	return 0;
}

如上面的代码所示:我们给a取了个别名b,给b取别名c…也就是b是a的引用,c是b的引用…。其实b,c,d都代表着a,它们都共用着一块内存空间。

如下图所示:

2.引用的使用和问题

引用的注意事项:

  • 引用必须初始化
  • 引用不能更改
  • 一个变量可以有多个引用

引用可以作为函数的参数也可以做返回值,在之前学习C语言我们常使用指针传参,也就是传址调用来改变外部变量的值。学习引用后,我们只用引用传参就会特别方便。

当返回引用时,就会引出很多问题,这里我们来解析下下面的代码:

int& Add()
{
	int n = 0;//静态变量static int a = 0;
	n++;

	return n;
}

int main()
{
	int ret=Add();
	cout << ret << endl;
	return 0;
}

n在Add函数中变为1,Add返回了n的引用,我们用变量ret来接收n的引用也就是n的值,但是有个问题就是——n在出Add函数后,函数栈帧如果被清理的话,函数返回引用找到的值就会是随机值。如果栈帧没有被清理,那ret侥幸是正确的1。为了避免这种情况我们可以将Add函数的n设为静态变量。

为了验证,我们再看一下面的代码:

int& Add(int x)
{
	int n = x;
	n++;
	return n;
}

int main()
{
	int& ret=Add(10);
	cout << ret << endl;

	Add(20);
	rand();
	cout << ret << endl;
	return 0;
}

假设出Add函数后栈帧不破坏那打印结果就是11\n21,但是我们调用个函数,模拟函数栈帧破坏的情况,那结果是不是像我们预想的那样为随机值呢。

总结

引用传参适合大部分的情况

将引用返回值时需要注意引用对象还是否出函数是否还存在。

下面我们来看引用使用场景及其优点:

1.引用做参数-(输出型参数)

2.引用做参数-(减少拷贝提高效率) (大对象/深拷贝类对象)

3.引用做返回值-(减少拷贝提高效率) (大对象/深拷贝类对象)

4.引用做返回值-修改返回值+获取返回值

接下来再讲一下常引用、引用权限的放大、缩小、平移:

int func()
{
	stctic int a=0;
	a++;
	return a;
}
int main()
{
	//引用的权限可以平移和缩小不可以放大
	int a = 0;
	int& b = a;//平移
	const int& c = a;//缩小
	++a;
	++c;//放大


	const int a = 10;
	int& b = a;//只能给变量取别名

	double c = 3.14;
	int& d = c;//引用的类型需要匹配
	const int& e = c;//类型转换会创建临时变量 临时变量具有常量性质

	int& ret=func();//权限放大
	return 0;
}

语法层面上引用不会开空间知识对变量取得一个别名,而从底层汇编指令来看的话引用是类似指针的方式使用的。

3.引用与指针的比较

引用和指针有许多不同点:

  • 引用需要初始化,指针不要求
  • 引用不能修改,指针可以
  • 有空指针,没有空引用
  • 引用更为安全,指针可能出现野指针和越界等情况
  • 在sizeof中引用是类型的字节大小,指针是根据机器位数来判断字节个数
  • 引用在语法上定义一个变量的别名,指针储存一个变量的地址
  • 有多级指针没有多级引用
  • 指针需要根据地址解引用访问,引用是编译器自己处理的

二.关键字auto

auto可以自动识别类型,当类型过于复杂冗长时,auto使用起来非常的方便。

int main()
{
    int a = 1;
    auto b = 10;
    auto c = 3.14;
}

在同一行定义多个变量时,需要注意同一行的变量类型要一致,不然auto无法正确识别:

int main()
{
    auto a = 1, b = 2; 
     auto c = 3, d = 4.0;//类型不同
}

auto还不能作为函数的参数以及定义数组

auto还有个重要的应用——范围for循环

他提供了一种更简便的for遍历的方法根据冒号”:”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示迭代的范围。

int main()
{

	int arr[] = { 0,1,2,3,4,5,6 };

	for (auto x : arr)
		cout << x << endl;
}

以上就是一文详解C++中的引用与关键字auto的详细内容,更多关于C++引用与关键字auto的资料请关注脚本之家其它相关文章!

相关文章

  • C++ Array容器的显示和隐式实例化详细介绍

    C++ Array容器的显示和隐式实例化详细介绍

    这篇文章主要介绍了C++中Array容器的隐式实例化和显式实例化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C++函数三种传参形式(指针传递、引用传递、值传递)

    C++函数三种传参形式(指针传递、引用传递、值传递)

    不论是哪种参数传递方式,都有形参和实参之分,本文主要介绍了C++函数三种传参形式(指针传递、引用传递、值传递),具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Linux系统下如何使用C++解析json文件详解

    Linux系统下如何使用C++解析json文件详解

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。下面这篇文章主要给大家介绍了关于Linux系统下如何使用C++解析json文件的相关资料,需要的朋友可以参考下
    2021-06-06
  • C++设计模式编程中的观察者模式使用示例

    C++设计模式编程中的观察者模式使用示例

    这篇文章主要介绍了C++设计模式编程中的观察者模式使用示例,观察者模式在被观察者和观察者之间建立一个抽象的耦合,需要的朋友可以参考下
    2016-03-03
  • C++详细讲解继承与虚继承实现

    C++详细讲解继承与虚继承实现

    这篇文章主要介绍了Java中的继承详情,继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法,下文介绍需要的朋友可以参考下
    2022-04-04
  • C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    本文主要介绍了C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C++的拷贝构造函数你了解吗

    C++的拷贝构造函数你了解吗

    这篇文章主要为大家详细介绍了C++的拷贝构造函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言中的sscanf()函数使用

    C语言中的sscanf()函数使用

    本文主要介绍了C语言中的sscanf()函数使用,sscanf通常被用来解析并转换字符串,可以实现很强大的字符串解析功能,下面就一起来了解一下
    2023-05-05
  • C语言中的结构体快排算法

    C语言中的结构体快排算法

    这篇文章主要介绍了C语言中的结构体快排算法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C调用C++代码的方法步骤

    C调用C++代码的方法步骤

    本文主要介绍了C调用C++代码的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论