【C++】引用那些事(1)

一、什么是引用? 

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它
引用的变量共用同一块内存空间

比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。

类型& 引用变量名(对象名) = 引用实体;

void TestRef()
{
  int a = 10;
  int& ra = a;//<====定义引用类型
  printf("%p\n", &a);
  printf("%p\n", &ra);
}

在这里,a和ra其实指向同一空间,它们的地址是一样的,所以,ra相当于a的别名。 

注意:引用类型必须和引用实体同种类型

二、特点:

1. 引用在定义时必须初始化!!!

void TestRef()
{
  int a = 10;
  // int& ra; // 该条语句编译时会出错
  int& ra = a;
  int& rra = a;
  printf("%p %p %p\n", &a, &ra, &rra);
}

2. 一个变量可以有多个引用

void TestRef()
{
  int a = 10;
  int& ra = a;//<====定义引用类型
  int& rra=ra;
  int& rrra=rra;
  printf("%p\n", &a);
  printf("%p\n", &ra);
}

3. 引用一旦引用一个实体,再不能引用其他实体

void TestRef()
{
  int a = 10;
  int& ra = a;//<====定义引用类型
  int b = 100;
  ra = b;//这句代码是指把b赋值给ra,引用是从一而终的,一旦引用就定了,不能在引用别的变量
  printf("%p\n", &a);
  printf("%p\n", &ra);
}

三、常引用 

下图代码里,a,b都是 const 类型的,所以必须用 const 的引用 。在引用时,权限可以缩小,不可以放大。

void TestConstRef()
{
   const int a = 10;
   //int& ra = a; // 该语句编译时会出错,a为常量,具有常属性,不可修改
   const int& ra = a;

   // int& b = 10; // 该语句编译时会出错,b为常量
   const int& b = 10;

   int c =20;
   const int& rc = c;//正确

   double d = 12.34;
   //int& rd = d; // 该语句编译时会出错,在编译时,d先给一个临时变量,临时变量再给rd,但是该临时变量具有常属性,即不可修改,所以错误
   const int& rd = d;//加上const即正确
}

四、引用的作用(使用场景)

1.做参数

void Swap(int& left, int& right)
{
  int temp = left;
  left = right;
  right = temp;
}

2.做返回值

int& TestRefReturn(int& a)
{
   a += 10;
   return a;
}

注意:如果函数返回时,离开函数作用域后,其栈上空间已经还给系统,因此不能用栈上的空间作为引用类型返回。如果以引用类型返回,返回值的生命周期必须不受函数的限制(即比函数生命周期长)。

猜你喜欢

转载自blog.csdn.net/Miss_Monster/article/details/85928158