zoukankan      html  css  js  c++  java
  • C++中引用的本质分析

    引用的意义

    • 引用作为变量别名而存在,因此在一些场合可以代替指针
    • 引用相对于指针来说具有更好的可读性和实用性
    • swap函数的实现对比:

    void swap(int* a, int* b)

    {

    int t = *a;

    *a = *b;

    *b = t;

    }

    void swap_yinyong(int& a,int& b)

    {

    int t = a;

    a = b;

    b = t;       

    }

    int main()

    {

    int a = 1;

    int b = 2;

    printf("a = %d,b = %d\n",a,b);

    swap(&a,&b);

    printf("指针版本:a = %d, b = %d\n",a,b);

    swap_yinyong(a,b);

    printf("引用版本:a = %d, b = %d\n",a,b);

    return 0;

    }

    特殊的引用:const引用

    • 在C++中可以声明const引用

    Const Type& name = val;

    Const 引用让变量拥有只读属性

    int main()

    {

    int a = 1;

    const int& b = a;

    int *p = (int*)&b;

    //b = 5; 编译报错,显示不能对只读变量赋值

    *p = 5; //要想改变只读变量,可以对他的指针进行操作

    printf("a = %d\n",a);

    return 0;

    }

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

    int main()

    {

    const int& b = 1;

    int *p = (int*)&b;

    *p = 5; //要想改变只读变量,可以对他的指针进行操作

    printf("a = %d\n",b);

    return 0;

    }

    使用常量对const引用初始化后将生成一个只读变量

    引用在C++中的内部实现是一个指针常量

    clip_image001

    • 因此引用占用的内存空间与指针相同(一般是四个字节)
    • 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节

    struct Tref

    {

    char& c;       

    };

    int main()

    {

    char c = 'c';

    char& rc = c;       

    Tref ref = { c };

    printf("sizeof(char&)%d\n",sizeof(char&));       

    printf("sizeof(rc)%d\n",sizeof(rc));

    printf("sizeof(ref.c)%d\n",sizeof(ref.c));

    printf("sizeof(Tref)%d\n",sizeof(Tref));

    return 0;

    }

    struct Tref

    {

    char* before;

    char& ref;

    char* after;       

    };

    int main()

    {

    char a = 'a';

    char b = 'b';       

    char c = 'c';

    Tref r = {&a,b,&c};

    printf("sizeof(r)%d\n",sizeof(r));

    printf("sizeof(Tref.before)%d\n",sizeof(r.before));

    printf("sizeof(Tref.after)%d\n",sizeof(r.after));

    printf("&r.before=%p\n",&r.before);

    printf("&r.after= %p\n",&r.after);

    return 0;

    }

    引用的意义

    • C++中的引用大多数情况下能够代替指针
    • 功能性:可以满足多数需要使用指针的场合
    • 安全性:可以避开由于指针操作不当而带来的内存错误
    • 操作性:简单易用,又不失功能强大

    小结:

    • 引用作为变量别名而存在旨在代替指针
    • const引用可以使得变量具有只读属性
    • 引用的最终本质为为指针
    • 引用可以尽可能的避开内存错误
  • 相关阅读:
    Linux零拷贝技术 直接 io
    纯Python模式
    c 越界 数组越界
    哈希 二叉树
    Cache busting
    sub esp
    lisp 代码即数据
    hexdump
    nmap
    对象 闭包
  • 原文地址:https://www.cnblogs.com/ryluo/p/10037288.html
Copyright © 2011-2022 走看看