C++左值引用

c++左值引用

1.左值引用是什么

左值引用是一个变量的别名

2.左值引用声明

<类型名> &引用名 = 被引用对象;
必须在声明的时候初始化,一旦初始化,就不可以引用其他变量

原因:

int a = 3;
int b = 5;
int &c = a;//引用c指向a,或者说c引用了a

注意下面的语句:

c = b;

将b的值赋给c引用的变量(a)? 还是 引用c指向了b?

出现了二义性,所以,不允许在声明之后修改引用的指向,上面的赋值语句只是将b的值赋给c引用的变量

3.引用和指针

指针本身也是一个变量

    int a = 3;
    int *pa = &a;

    cout << "指针pa的地址:" << &pa << endl;
    cout << "变量a的地址:" << &a << endl;

结果它两的地址并不相同,指针本身是一个变量

引用是一个变量的别名

int a = 3;
int &b = a;

cout << "变量a的地址:" << &a << endl;
cout << "引用b的地址:" << &b << endl;

结果它两的地址相同,所以,引用本身就是一个别名,也就是说,给它引用的内存空间起了另一个名字

使用上的差异

指针使用的时候需要间接访问(解引用);而引用在使用的时候,可以直接使用

扫描二维码关注公众号,回复: 5747782 查看本文章
int a = 3;
int *pa = &a;
int &b = a;

a 就是 *pa 就是 b

和指针一样,基类引用也可以指向派生类

4.const引用(也被称为常量引用)

首先,不能通过const引用修改被引用对象的值

和普通引用的区别

普通的引用,初始化的时候必须指向一个左值 左值,就是可以吃现在赋值号左边的变量或者表达式,例如变量名、数组的间接访问array[index]

const引用不同,const引用可以指向一个左值,也可以指向一个非左值计算这个非左值表达式的值,然后存储在一个新生成的自动变量中,引用则会引用这个自动变量

5.const左值引用指向自动生成临时变量的两种情况

  1. 类型不匹配

    int a = 3;
    const long &b = a;
    
    cout << "变量a的地址:" << &a << endl;
    cout << "引用b的地址:" << &b << endl;
    

    输出结果显示,地址并不相同,所以,b引用了一个新的变量

  2. 初始化一个非左值

    int a = 3;
    const int &b = a + 3;
    
    cout << "变量a的地址:" << &a << endl;
    cout << "引用b的地址:" << &b << endl;
    

    输出结果显示,地址并不相同,所以,b引用了一个新的变量

6.const左值引用常用作函数形参的声明

 

  1. 形参声明为const,可以接受非const实参
  2. 形参声明为const,可以接受非左值实参这种情况下,会生成一个新的变量存储这个非左值的值,类似于形参是一个普通变量

 

这样的机制,使得函数更加灵活

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/88908477