高效的引用变量&

一.引用的概念及用法
引用:给一个已经定义了的变量重新起一个别名。
定义格式:
类型&引用变量名=已定义的变量名

(一)引用原则:
1、引用必须在定义的时候就给定引用对象,而且一个引用变量只能引用唯一的一个已经定义的变量。
2、一个变量可以有多个不同的引用变量。

这里写图片描述

这里写图片描述
3、引用变量也是变量,也可以被引用。
4、

int a = 10;
int&&b = a;//错误
int& *p=&a;//错误

不允许创建引用的引用,也不能有指针的引用。
5、不能建立数组的引用。

难点:(二)const在引用中
我们知道const修饰的变量具有只读属性,也可称之为常属性。即const修饰的变量不允许被改变。

int a = 10;
int&b = a;

int a = 10;
const int&b = a;

const int a = 10;
const int&b = a;
以上三种均合法
const int a = 10;
int&b = a;
这里就会有bug,因为const变量a,在被b引用时候丢失了const,
也就是说b的非const属性可以改变a的值,这与const a形成矛盾。

引用这里的的const遵循以下原则:
非const变量在被引用时候,可以被const引用变量和非const引用变量引用。
而const变量只能被const引用变量引用。

二.引用做参数
1、引用作为函数参数会比传值调用更加高效;会比传址调用更加安全。

2、引用作为函数参数可以改变实例中的参数,因为它是变量的别名,如果不允许改变实例参数,可以在参数列表加const限定。

#include<iostream>

int Add(const int& a, const int& b)
{
    return a + b;
}
int main()
{
    int a = 80;
    int b = 20;
    std::cout<<Add(a, b)<<std::endl;
    system("pause");
}

这里写图片描述

三.引用做函数返回值

条件:函数的返回值必须存在于函数形参列表中,因为调函数形成栈帧在函数调用结束就会被销毁。所以函数调用结束,只有存在于实例中的变量才有访问权限。
优点:引用作为函数返回值,不存在了拷贝构造,减少了开销,提高了效率。

#include<iostream>

int& Add(int& a, const int& b)
{
    a = a + b;
    return a;
}
int main()
{
    int a = 80;
    int b = 20;
    std::cout<<Add(a, b)<<std::endl;
    system("pause");
}

上述代码会更改掉a的值,如果不想更改a的值,需要在函数参数列表中加一个参数用来接受返回值。
这里写图片描述
四.汇编层看引用的特性
这里写图片描述
引用和指针的底层实现是一样的,也就是说,定义一个变量a的引用变量b,在底层实际上就是定义了b变量存储了a的地址。

五.引用和指针的区别

你现在是不是很懵逼,怎么引用和指针的底层是一样的??

实际上,引用和指针区别很大:

1、定义:指针变量的内容是原变量的地址,引用变量是原变量的别名。
2、引用只能在变量定义时候初始化一次(从一而终),而指针变量的值可以更改。
3、引用必须指向有效的变量,而指针可以是空指针。
4、sizeof(引用变量)等同于sizeof(原变量);
在32为系统下,sizeof(指针变量)等于4。
5、指针在使用时候,需要注意指针是否为空,释放指针所指向的地址,需要置空,否则可能存在野指针问题。

猜你喜欢

转载自blog.csdn.net/Vickers_xiaowei/article/details/80635035