• 引用


    定义:引用就是已经定义的变量的别名。

    语法:Type& name = var;

    eg: int a = 0;
       int& b = a;  // b 就是 a 的别名
       b = 5;       // 操作 b 就是操作 a
    引用在定义的时候必须用同一种类型进行初始化,a,b类型相同。

    含义:在C++中可以对同一段内存起不同的名字。

    1. 引用代替指针

    void swap( int& a , int& b )  //同一变量的地址
    {
      int temp = a;
      a = b;
      b = temp;  
    }
    
    void swap(int *a,int* b)
    {
      int temp = *a;
      *a = *b;
      *b = temp;
    }
    
    int main(void)
    {
      int a=1,b=2;
      swap(a,b);
      return 0;
    }

    2. const引用

      语法:const Type& name = var;

      含义:const引用让变量拥有只读属性。

    int a = 4;
    const int& b = a;
    b = 5;                 // error 

      注:引用中不可以用常量来初始化。const引用可以。

          int& a = 1;   //error
    const int& a = 1;   //此时编译器会创建只读常量,内存创建四个字节地址,用b作为其别名。本质还是变量
    int *p = (int *)&a; // 用p将只读变量a转化为普通变量
    *p = 5 ;       // ok a==5

      const引用的类型与初始化变量的类型

        a. 相同时:初始化变量为只读变量

        b. 不同时:创建一个新的只读变量

    char c = 'c';       // c是常量
    char& rc = c;       // rc是只读变量
    const int& trc = c; // trc是新的只读变量,初始化类型与const引用类型不同,新的内存地址
    rc = 'a';
    printf("c = %c ", c);      // a
    printf("rc = %c ", rc);    // a
    printf("trc = %c ", trc);  // c

    3.引用在C++内部的实现是指针常量

      指针常量规定了指针指向的地址不可变。使用时引用 a 相当是 *a。

      Type& name;   <==>  Type* const  name;

    void fun(int& a)    { a = 5;}  //等价
    void fun(int* const a)    {*a = 5;}

    4. 指针与引用的区别

      1. 引用在创建时必须初始化,以后不可以代表其他变量(c语言中指针可以指向其他变量)。

      2. const引用使其变量拥有只读属性(C语言指针可以被const修饰为只读变量或者常量)。

      3. 所有对引用的操作可以直接作用于代表的变量(c语言中解指针才是)。

    #include <stdio.h>
    
    int a = 1;
    
    struct SV
    {
        int& x;
        int& y;
        int& z;
    };
    
    int main()
    {
        int b = 2;
        int* pc = new int(3);
        SV sv = {a, b, *pc};        // 结构体成员全部为引用,成员地址空间不连续。
        int& array[] = {a, b, *pc}; // error  数组成员全部为引用 ,成员地址空间不连续,与C语言数组空间连续冲突,C++不支持引用数组。  
                                    // 在C++编译器的角度引用是别名,直接代表变量。在C编译器的角度中指针常量是一个常量。
        
        printf("&sv.x = %p
    ", &sv.x);   // 成员地址在静态存储区
        printf("&sv.y = %p
    ", &sv.y);   // 成员地址在栈区
        printf("&sv.z = %p
    ", &sv.z);   // 成员地址在堆区
                                         
        delete pc;
        
        return 0;
    }
  • 相关阅读:
    机器学习知识点总结(1)
    RPC基本原理
    Oracle中ORA-01113,ORA-01110的简单解决
    跟着whatwg看一遍事件循环
    node进程间通信
    白话协程【前端视角】
    白话typescript中的【extends】和【infer】(含vue3的UnwrapRef)
    原来rollup这么简单之插件篇
    面试官: 说说你对async的理解
    白话web安全
  • 原文地址:https://www.cnblogs.com/zsy12138/p/10679117.html
Copyright © 2020-2023  润新知