C++中的引用与关键字auto怎么使用

这篇文章主要讲解了“C++中的引用与关键字auto怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的引用与关键字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&hellip;也就是b是a的引用,c是b的引用&hellip;。其实b,c,d都代表着a,它们都共用着一块内存空间。

    如下图所示:

    C++中的引用与关键字auto怎么使用  c++ 第1张

    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的值,但是有个问题就是&mdash;&mdash;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,但是我们调用个函数,模拟函数栈帧破坏的情况,那结果是不是像我们预想的那样为随机值呢。

    C++中的引用与关键字auto怎么使用  c++ 第2张

    总结

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

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

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

    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怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是蜗牛博客,小编将为大家推送更多相关知识点的文章,欢迎关注!

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论Telegram