第5课-引用的本质分析

1. 引用的意义

  • 引用作为变量别名而存在,因此在一些场合可以代替指针

  • 引用相对指针来说具有更好的可读性实用性

swap函数的实现对比:

void swap(int& a, int& b)
{
     int t = a;
     a = b;
     b = t; 
}

void swap(int* pa, int* pb)
{
    int t = *pa;
    *pa = *pb;
    *pb = t
}

注意:函数中的引用形参不需要初始化!

 

2. 特殊的引用

  • const引用

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

    - const Type& name = var;

    - const引用让变量拥有只读属性

int a = 4;
const int& b = a;
int* p = (int*)&b;

b = 5;  // Error,只读变量

*p = 5;  // OK,修改变量a的值

 

 

  • 当使用常量const引用初始化时,编译器会为这个常量分配空间,并将引用名作为这段空间的别名
const int& b = 1;  // OK
int* p = (int*)b;

b = 5;  // Error,只读变量

*p = 5;  // OK,修改变量a的值

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

 

3. 思考

引用有自己的存储空间吗?

struct TRef
{
  char& rc;
}

printf("sizeof(TRef) = %d\n", sizeof(TRef));

 

4. 引用的本质

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

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

void f(int& a)            void f(int* const a)
{                         {
  a = 5;      <==>          *a = 5;
}                         }

注意:

1.  C++编译器在编译过程中用指针常量作为引用的内部实现,因此引用所占用的空间大小与指针相同

2. 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节

 

5. 引用的意义

  • C++的引用旨在大多数情况下代替指针

    - 功能性:可以满足多数需要使用指针的场合

    - 安全性:可以避免由于指针使用不当而带来的内存错误

    - 操作性:简单易用,又不失功能强大

 

6. 小结

  • 引用作为变量别名而存在旨在代替指针

  • const引用使得变量拥有只读属性

  • 引用在编译器内部使用指针常量实现

  • 引用的最终本质为指针

  • 引用可以尽可能的避开内存错误

 

本文出处:狄泰软件学院

posted @ 2020-03-12 22:16  WisdomMan  阅读(0)  评论(0)    收藏  举报