【记3】引用的概念和本质

2018-05-29  本文已影响0人  CozyMoonquake

一、引用的概念。
引用没有定义,是一种关系型声明,声明它和原有某一变量(实体)的关系,故其类型与原类型保持一致,且不分配内存,与被引用的变量具有相同的地址。
在声明的时候必须初始化,一经声明,不可更改,以下的re已经声明了是a的引用,就不能再成为b的引用了。
另外,可对引用再次引用,多次引用的结果,即某一变量具有多个别名,以下的re和re1即都是a的别名。
因此,符号&前有数据类型时,表示引用,其它皆为取地址。在传递参数时,引用比指针更方便。

#include<iostream>
using namespace std;
int main(void)
{
    int a=10;
    int b=20;

    int *p=&a;
    *p=30;
    p=&b;
    *p=40;//改变的是b

    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;

    int &re=a;//int & 是引用数据类型,re是a的别名
    re=50;
    cout<<"a="<<a<<endl;

    re=b;//re不能成为b的引用
    re=60;
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;

    int &re1=re;
    re1=70;
    cout<<"a="<<a<<endl;
    cout<<"re="<<re<<endl;
    cout<<"re1="<<re1<<endl;

    return 0;
}

二、引用的本质。
1、引用和指针占用的空间大小是相同的。
2、引用和常量一样,都必须要初始化。
由以上两点,引用实现的底层即是一个常指针,即
int &re=a;
等价于
int *const re=&a;
举例如下:

void change1(int *const a) //int *const a = main::&a
{
    *a = 100;    
}
void change2(int &a)//当我们将引用作为函数参数传递时,编译器会替我们将函数实参取地址给引用
                    //int &a = main::&a

{
    a = 100;        //对一个引用操作时,编译器替我们对隐藏*操作
}

总结,当我们去研究一个引用的时候,可以将其当做一个常指针来研究。但当我们使用引用来编程的时候,只需将其当做变量的一个别名即可,这样会方便许多,避免理解上的混乱。另外,引用作为返回值时,不要返回局部变量的引用,否则若会在外部对该引用再次进行引用时,由于局部变量的生命周期已随着函数的执行完毕而销毁,由此会造成不安全事件。以上问题解决方法可以使用static静态变量,此时的引用作为函数返回值时,可以在外部作为左值使用。

上一篇下一篇

猜你喜欢

热点阅读