浅谈c++引用 |
您所在的位置:网站首页 › c++ 左值右值引用 › 浅谈c++引用 |
浅谈c++
在这里开设 系列专题,针对C++重点内容展开探讨与观察底层,同时也是一个面试专栏,所选知识大多为面试常见问题.前期较为基础,难度会逐渐上升哦~ 本专栏采用经典的哲学三段论编写:是什么|为什么|怎么做 力图精简,高效. 第一章: 浅谈C++函数重载 传送门 浅谈c++什么是引用为什么存在引用我们平常如何使用引用常引用两个重要使用场景做参数做返回值 引用与指针的不同点总结 什么是引用引用不是新定义一个变量,是给已经存在的变量取了一个别名,引用变量不会开辟 新的内存空间,它和它引用的变量共用一块内存空间. 类型& 对象名 = 引用实体;以上是一些使用特征,有 引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体,再不能引用其他实体 指针在没有const修饰下可以指向其他地址 为什么存在引用既然C语言通过指针能够很好的进行内存操作,那为什么会在C++新增引用这样的操作. C++中引用最初是为了解决运算符重载的问题; 关于运算符重载,我们会在本专栏下一章****中进行整理. 另一个特点就是可以引用临时对象;也是类和对象话题. 实践中,使用指针通常会有: 空指针野指针人为修改指针变量但不知情引用则有: 引用不允许为空(空指针)定义初始化(野指针)只能指向一个实体(值修改) 我们平常如何使用引用 常引用C语言中我们可以借助const关键字对指针进行控制,引用和指针这么像,那么const可不可以用于引用呢? 产生如上报错 运行成功 权限的放大这样呢? 运行成功 权限的缩小取别名的原则:对原引用变量,权限只能缩小,不能放大,经过const修饰,权限变为只读. 那么,我们可不可以给常量取别名呢? int a = 10; int &b = a; int &c = 20;//?当然不可以,原理同上,20作为常量权限为只读,直接进行引用属于权限的放大. const int &c = 20;权限相同即可 继续观察如下代码 double d = 3.14; const int& e = d;已知引用有必须指向相同类型的特性,为什么这样的代码可以运行呢? C语言存在隐式类型转换,C++以C语言为基础,沿用了这种特性. 数据转换时会产生临时变量,会把转换后的数据取出存放进来,且具有常性质,是只读的.const引用则指向了这块临时变量,是临时变量的别名. 之后临时变量会拷贝到e,e的改变不影响临时变量.e是临时变量的别名,不再指向d. 从此,临时变量的生命周期就跟着e走啦!!! 涉及到了函数传参问题,当函数的参数为引用时,就要注意参数之间的权限匹配问题啦.只能相等或缩小,不能放大. //void func(const int& x)就可以啦 void func(int& x) { } int main() { int a = 10; const int &b = a; func(a); func(b);//是不可以滴 return 0; } 两个重要使用场景 做参数 void Swap(int &x, int &y) { int tem = x; x = y; y = tem; } void Swap(double &x, double &y) { double tem = x; x = y; y = tem; } int main() { int a = 0; int b = 1; Swap(a, b); double c = 1.2; double d = 3.4; Swap(c, d); }不像以前C语言时需要借助指针解引用那么麻烦,传入了变量的别名,指向同一块地址,直接可以进行修改. 也可以做输出型参数(薄纱C) 同时传引用的效率高于传值或者传指针20-30倍. 意义: 输出型参数减少拷贝,提高效率 做返回值静态变量的补充:在同一个作用域只会初始化一次,指向的是同一块地址. 传值返回 int count() { static int n = 0; n++; return n; } int main() { int ret = count(); return 0; }传值返回过程中,会产生一个临时变量,如果数据较小,将用寄存器代替,如果数据较大,则会在上一层栈帧中开辟预留空间进行拷贝.会先将n传给临时变量,临时变量拷贝到ret;当n没有用static修饰时,在函数栈帧中,出了count的作用域n就会销毁,所以需要临时变量的帮助. 传引用返回 int &count() { static int n = 0; n++; return n; } int main() { cout |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |