一.引用1.引用的概念引用就是给一个已经存在的变量取一个别名与变量共用一段内存空间。注意引用的类型必须和变量类型相同来演示下引用如何使用。1234567891011121314151617#include iostreamusingnamespacestd;intmain(){inta 1;int b a;int c b;int d c;cout a endl;cout b endl;cout c endl;cout d endl;return0;}如上面的代码所示:我们给a取了个别名b给b取别名c…也就是b是a的引用c是b的引用…。其实b,c,d都代表着a它们都共用着一块内存空间。如下图所示:2.引用的使用和问题引用的注意事项:引用必须初始化引用不能更改一个变量可以有多个引用引用可以作为函数的参数也可以做返回值在之前学习C语言我们常使用指针传参也就是传址调用来改变外部变量的值。学习引用后我们只用引用传参就会特别方便。当返回引用时就会引出很多问题这里我们来解析下下面的代码:1234567891011121314int Add(){intn 0;//静态变量static int a 0;n;returnn;}intmain(){intretAdd();cout ret endl;return0;}n在Add函数中变为1Add返回了n的引用我们用变量ret来接收n的引用也就是n的值但是有个问题就是——n在出Add函数后函数栈帧如果被清理的话函数返回引用找到的值就会是随机值。如果栈帧没有被清理那ret侥幸是正确的1。为了避免这种情况我们可以将Add函数的n设为静态变量。为了验证我们再看一下面的代码:1234567891011121314151617int Add(intx){intn x;n;returnn;}intmain(){int retAdd(10);cout ret endl;Add(20);rand();cout ret endl;return0;}假设出Add函数后栈帧不破坏那打印结果就是11\n21但是我们调用个函数模拟函数栈帧破坏的情况那结果是不是像我们预想的那样为随机值呢。总结引用传参适合大部分的情况将引用返回值时需要注意引用对象还是否出函数是否还存在。下面我们来看引用使用场景及其优点:1.引用做参数-(输出型参数)2.引用做参数-(减少拷贝提高效率) (大对象/深拷贝类对象3.引用做返回值-(减少拷贝提高效率) (大对象/深拷贝类对象4.引用做返回值-修改返回值获取返回值接下来再讲一下常引用、引用权限的放大、缩小、平移:1234567891011121314151617181920212223242526intfunc(){stcticinta0;a;returna;}intmain(){//引用的权限可以平移和缩小不可以放大inta 0;int b a;//平移constint c a;//缩小a;c;//放大constinta 10;int b a;//只能给变量取别名doublec 3.14;int d c;//引用的类型需要匹配constint e c;//类型转换会创建临时变量 临时变量具有常量性质int retfunc();//权限放大return0;}语法层面上引用不会开空间知识对变量取得一个别名而从底层汇编指令来看的话引用是类似指针的方式使用的。3.引用与指针的比较引用和指针有许多不同点:引用需要初始化指针不要求引用不能修改指针可以有空指针没有空引用引用更为安全指针可能出现野指针和越界等情况在sizeof中引用是类型的字节大小指针是根据机器位数来判断字节个数引用在语法上定义一个变量的别名指针储存一个变量的地址有多级指针没有多级引用指针需要根据地址解引用访问引用是编译器自己处理的二.关键字autoauto可以自动识别类型当类型过于复杂冗长时auto使用起来非常的方便。123456intmain(){inta 1;auto b 10;auto c 3.14;}在同一行定义多个变量时需要注意同一行的变量类型要一致不然auto无法正确识别:12345intmain(){auto a 1, b 2;auto c 3, d 4.0;//类型不同}auto还不能作为函数的参数以及定义数组auto还有个重要的应用——范围for循环他提供了一种更简便的for遍历的方法根据冒号”:”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示迭代的范围。
一文详解C++中的引用与关键字auto
一.引用1.引用的概念引用就是给一个已经存在的变量取一个别名与变量共用一段内存空间。注意引用的类型必须和变量类型相同来演示下引用如何使用。1234567891011121314151617#include iostreamusingnamespacestd;intmain(){inta 1;int b a;int c b;int d c;cout a endl;cout b endl;cout c endl;cout d endl;return0;}如上面的代码所示:我们给a取了个别名b给b取别名c…也就是b是a的引用c是b的引用…。其实b,c,d都代表着a它们都共用着一块内存空间。如下图所示:2.引用的使用和问题引用的注意事项:引用必须初始化引用不能更改一个变量可以有多个引用引用可以作为函数的参数也可以做返回值在之前学习C语言我们常使用指针传参也就是传址调用来改变外部变量的值。学习引用后我们只用引用传参就会特别方便。当返回引用时就会引出很多问题这里我们来解析下下面的代码:1234567891011121314int Add(){intn 0;//静态变量static int a 0;n;returnn;}intmain(){intretAdd();cout ret endl;return0;}n在Add函数中变为1Add返回了n的引用我们用变量ret来接收n的引用也就是n的值但是有个问题就是——n在出Add函数后函数栈帧如果被清理的话函数返回引用找到的值就会是随机值。如果栈帧没有被清理那ret侥幸是正确的1。为了避免这种情况我们可以将Add函数的n设为静态变量。为了验证我们再看一下面的代码:1234567891011121314151617int Add(intx){intn x;n;returnn;}intmain(){int retAdd(10);cout ret endl;Add(20);rand();cout ret endl;return0;}假设出Add函数后栈帧不破坏那打印结果就是11\n21但是我们调用个函数模拟函数栈帧破坏的情况那结果是不是像我们预想的那样为随机值呢。总结引用传参适合大部分的情况将引用返回值时需要注意引用对象还是否出函数是否还存在。下面我们来看引用使用场景及其优点:1.引用做参数-(输出型参数)2.引用做参数-(减少拷贝提高效率) (大对象/深拷贝类对象3.引用做返回值-(减少拷贝提高效率) (大对象/深拷贝类对象4.引用做返回值-修改返回值获取返回值接下来再讲一下常引用、引用权限的放大、缩小、平移:1234567891011121314151617181920212223242526intfunc(){stcticinta0;a;returna;}intmain(){//引用的权限可以平移和缩小不可以放大inta 0;int b a;//平移constint c a;//缩小a;c;//放大constinta 10;int b a;//只能给变量取别名doublec 3.14;int d c;//引用的类型需要匹配constint e c;//类型转换会创建临时变量 临时变量具有常量性质int retfunc();//权限放大return0;}语法层面上引用不会开空间知识对变量取得一个别名而从底层汇编指令来看的话引用是类似指针的方式使用的。3.引用与指针的比较引用和指针有许多不同点:引用需要初始化指针不要求引用不能修改指针可以有空指针没有空引用引用更为安全指针可能出现野指针和越界等情况在sizeof中引用是类型的字节大小指针是根据机器位数来判断字节个数引用在语法上定义一个变量的别名指针储存一个变量的地址有多级指针没有多级引用指针需要根据地址解引用访问引用是编译器自己处理的二.关键字autoauto可以自动识别类型当类型过于复杂冗长时auto使用起来非常的方便。123456intmain(){inta 1;auto b 10;auto c 3.14;}在同一行定义多个变量时需要注意同一行的变量类型要一致不然auto无法正确识别:12345intmain(){auto a 1, b 2;auto c 3, d 4.0;//类型不同}auto还不能作为函数的参数以及定义数组auto还有个重要的应用——范围for循环他提供了一种更简便的for遍历的方法根据冒号”:”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示迭代的范围。