c++语法之引用

引用:

我们的引用就是我们的的别名一样,给我们的变量取了另外一个别名。比如我们每个人都会有一个小名,别人喊和这个名字,就是喊得你自己本人,这里的变量也是一样的,这里引用的值进行改变,也会改变别引用的那个值,变量和他的引用用同一块空间,他们的地址是一样的,引用和我们的指针有点相似,但是他会比我们的指针使用的方便。但是它不能替代我们的指针。

使用

类型&=被引用法人变量。

例子:

他们的地址:

 打印出来的结构是一样的。

引用特性

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

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

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

有这个第三个特性来看,就能知道我们的引用一定要初始化了;

由于不能应用其他的实体,这个b=c的操作就是赋值操作。

一个变量可以有多个引用就像我们一个人可以有很多歌别名一样。

常引用

例子:

void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // 该语句编译时会出错,a为常量
    const int& ra = a;
    // int& b = 10; // 该语句编译时会出错,b为常量
    const int& b = 10;
    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    const int& rd = d;
}

 第一个:const int a = 10;    //int& ra = a;   // 该语句编译时会出错,a为常量

这里的啊是有const修饰的a代表我们的a只能读不能修改,而我们的引用作为他的别名自然也只能是只能读不能修改,如果你写成:int& ra=a;的话就是可以修改的,会有权限的放大。

我们的权限是只能缩小的,不能放大的,

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

我们这里的10是一个常量,但是我们的int& b的b是可以修改的,我们知道常量是不能修改的,只能读取,所以这里还是一个权限的放大。

第三个:  double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    const int& rd = d;

1.这里就是我们的double和int的类型不同,导致我们在进行类型转换的时候会产生临时变量,临时变量具有常性,也是只能读取不能修改的。

2.double 和 int 是不同的数据类型。引用必须与其引用的对象类型相匹配。在你的例子中,rd 被声明为 int& 类型,试图引用一个 double 类型的变量 d。这种类型不匹配会导致编译器报错。

使用场景

做参数


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

做返回值

int& Count()
{
   static int n = 0;
   n++;
   // ...
   return n;
}

注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用 引用返回,如果已经还给系统了,则必须使用传值返回。

 看一个题目:

int& Add(int a, int b)
{
    int c = a + b;
    return c;
}
int main()
{
    int& ret = Add(1, 2);
    Add(3, 4);
    cout << "Add(1, 2) is :"<< ret <<endl;
    return 0;
}

他的输出的结果是什么?

 Add 函数返回了一个对局部变量 c 的引用。当 Add 函数返回时,c 的生命周期结束,其所占用的内存被释放。因此,ret 引用在此时变成了悬垂引用,指向了一个不再有效的内存地址。对于悬垂引用的使用是未定义行为,因为此时访问的内存区域可能已经被其他数据覆盖,或者被操作系统标记为不可访问的区域。这可能导致程序表现出不可预测的行为,包括崩溃或输出不正确的结果

 

传值、传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效 率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

引用和指针的不同点

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体

4. 没有NULL引用,但有NULL指针

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

相关推荐

  1. C++引用

    2024-07-11 02:36:03       39 阅读
  2. c++】cpp引用

    2024-07-11 02:36:03       33 阅读
  3. C++】循环语句引起的循环引用问题

    2024-07-11 02:36:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 02:36:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 02:36:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 02:36:03       57 阅读
  4. Python语言-面向对象

    2024-07-11 02:36:03       68 阅读

热门阅读

  1. 在Ubuntu 14.04上安装和配置VNC的方法

    2024-07-11 02:36:03       25 阅读
  2. iOS 应用内存超过多少会收到系统内存警告 ?

    2024-07-11 02:36:03       25 阅读
  3. 怎么在windows、linux、mac上安装pnpm呢?

    2024-07-11 02:36:03       26 阅读
  4. 数据结构与算法基础篇--二分查找

    2024-07-11 02:36:03       20 阅读
  5. Redis原理-数据结构

    2024-07-11 02:36:03       25 阅读
  6. ArduPilot开源代码之AP_OpticalFlow_CXOF

    2024-07-11 02:36:03       28 阅读
  7. QT实现WebSocket通信

    2024-07-11 02:36:03       24 阅读
  8. Text2SQL提问中包括时间的实战方案

    2024-07-11 02:36:03       22 阅读