C++(二十一) — 引用概念及本质

时间:2022-12-09 01:33:23

 1、引用概念

   引用是别名必须在声明的时候初始化。即:是指一个已定义变量的别名(一个内存空间,有两个名字都可以操作)

  引用:在函数调用时,是变量的别名,不可以单独存在,使用时必须要初始化

  指针:本身有自己的地址,可以单独存在。

 2、引用基本举例

   引用在交换时的例子:

void myswap01(int a, int b)
{
    int c = 0;
    c = a;
    a = b;
    b = c;
}

void myswap02(int *a, int *b)
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = c;
}

// 引用,变量的别名,指代同一个存储空间
void myswap03(int &a, int &b)
{
    int c = 0;
    c = a;
    a = b;
    b = c;
}

void main()
{
    int x = 10, y = 20;

    myswap01(x, y);
    cout << "x= " << x << "        y= " << y << endl;

    myswap02(&x, &y);
    cout << "x= " << x << "        y= " << y << endl;

    myswap03(x, y);
    cout << "x= " << x <<"        y= " << y << endl;

    system("pause");
}

3、引用本质思考

 (1)引用就是别名,指向同一块内存空间。

 (2)引用占用字节:int &a,,占用4个字节就相当于一个指针所占的内存;引用有自己的存储空间,保存地址;

struct teacher
{
    int age; // 4
    char & a;//4,,相当于一个指针,占用4个字节
    double &b;//4
};

void main()
{
    cout << sizeof(teacher) << endl;//12
    system("pause");
}

 (3)本质:引用在C++中的内部实现:一个常量指针,所以引用所占内存大小和指针相同;

  int& age ——> int* const age

   相当于:编译器帮我们取了一个实参地址。

 4、引用作为函数返回值

   1、函数返回值为引用时,内存空间是必须要存在的(静态变量、全局变量),如果返回的是栈变量(局部变量),会出错,因为局部变量在函数返回时,地址就销毁了,比如下面的错误例子:

int& get2()
{
    int a;
    a = 10;
    return a;
}

  如果返回的引用值,是静态变量或全局变量,则可以。

  关键:看返回的内存空间是不是有效的内存空间。

  2、引用作为左值,关键:看返回的内存空间是不是有效的内存空间。

// 返回的是一个值
int get1()
{
    int a;
    a = 10;
    return a;
}

// 返回的是变量本身
int& get2()
{
    static int a =10;
    a++;
    cout << "a:" << a << endl;
    return a;
}

void main()
{
    get2() = 100; // 10
    get2();       // 101

    system("pause");
}

 5、常量引用

int x = 10;
// 常量引用,变量只有只读属性,不能通过 y 去改变 x 的值
// 必须要初始化
const int &y = x;

// int &m = 11;// 11没有内存地址,所以错误,
const int &z = 12;  // 此时常量引用可以,编译器分配了内存空间给 Z,保存值:12