lessons5:引用(&)的本质

c++中新增类型-引用的本质

1.引用在c++的内部是实现一个指针常量

例如int &a = c; 等同于 int *const a = &c;
注意:
(1)、引用占用空间大小与指针相同。
(2)、引用是变量的一个别名。
(3)、引用的特性:
①功能性:本质是指针
②安全性:可以避免由于指针操作不当带来的内存错误
③操作性:简单

2.特殊的const引用

例如const int &a = var.
该引用使得变量有只读属性

int a = 4;
const int &b = a;
b = 5;  //错误:b是一个只读变量
int *p = (int *)&b;
*p = 6; //正确,修改变量a的值

注意:使用常量对const 引用进行初始化时,c++编译器会为常量值分配空间
,并将引用名作为这段空间的别名

const int &b = 1;   //用常量对const引用进行初始化
int *p = (int *)&b;
b = 5;  //错误, b是只读变量
*p = 5; //正确,修改变量a的值

结论:常量const引用初始化后将变成一个只读变量

实例剖析:

#include <stdio.h>

int &demo()     //int *const
{
    int d = 0;
    printf("demo: d = %d\n", d);
    return d;  //注意这里返回了一个局部变量的地址,在函数调用完成后该变量所占的内存空间被销毁,所以返回了一个可能不存在的地址,出错
}

int &func()     
{
    static int s = 0;
    printf("func: s = %d\n", s);
    return s;  //静态变量在全局静态存储区存储,该函数返回了静态变量的地址,正确
}

int main(int argc, char const *argv[])
{
    int &rd = demo();
    int &rs = func();

    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);

    rd = 10;
    rs = 11;

    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);
    return 0;
}

编译结果:
这里写图片描述
可以看出现在有的编译器会出现编译警告,但是运行直接崩溃。所以要仔细使用const引用,本质就是指针错误,而且必须消除编译产生的每一个警告信息,避免出错。

猜你喜欢

转载自blog.csdn.net/feiyanaffection/article/details/79117216