QT及C++中引用的用法和意义

.引用概述

1.引用的含义

引用(Reference)是 C++ 相对于C语言的又一个扩充。

引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。

2.引用的本质

其本质只是对指针进行了简单的封装,它的底层依然是通过指针实现的。

在 C++ 中引入引用的直接目的是为了让代码的书写更加漂亮,尤其是在运算符重载中,不借助引用有时候会使得运算符的使用很麻烦。

二.引用的示例

1.下面是一个演示引用的实例:

int main() {

    int a = 99;

    int &r = a; //第6行

    qDebug() << a << ", " << r ;

qDebug() << &a << ", " << &r ;

    return 0;

}

打印结果:

99 ,  99

0x4e6d7ffc30 ,  0x4e6d7ffc30

2.引用作为函数参数

//直接传递参数内容

void swap1(int a, int b) {

    int temp = a;

    a = b;

    b = temp;

}

//传递指针

void swap2(int *p1, int *p2) {

    int temp = *p1;

    *p1 = *p2;

    *p2 = temp;

}

//按引用传参

void swap3(int &r1, int &r2) {

    int temp = r1;

    r1 = r2;

    r2 = temp;

}

//测试应用:

//直接传递参数内容

swap1(100, 200);

qDebug << num1 << " " << num2 ;

返回:

100 200

//传递指针

swap2(100, 200);

qDebug << num1 << " " << num2 ;

返回:

200 100

//按引用传参

swap3(100, 200);

qDebug << num1 << " " << num2 ;

返回:

200 100

3.引用可以作为函数返回值

int &plus10(int &r) {

    r += 10;

    return r;

}

int main() {

    int num1 = 10;

    int num2 = plus10(num1);

    qDebug()<< num1 << "  " << num2 ;

    return 0;

}

运行结果是输出“20   20”

四、引用的本质

这里先给出结论:引用只是对指针进行了简单的封装,它的底层依然是通过指针实现的。

1.引用虽然是基于指针实现的,但它比指针更加易用,从上面的两个例子也可以看出来,通过指针获取数据时需要加*,书写麻烦,而引用不需要,它和普通变量的使用方式一样。

C++ 的发明人 Bjarne Stroustrup 也说过,他在 C++ 中引入引用的直接目的是为了让代码的书写更加漂亮,尤其是在运算符重载中,不借助引用有时候会使得运算符的使用很麻烦。

2.简单总结就是:

下次你遇到一个引用 int &r = num,由于编译器的内部转换,输出&r 的效果等同于输出 &num。

或者由于编译器的内部转换,可以把引用 r 彻底等同于 num,因此 &r 等同于 &num。

五、引用和指针的区别

1、引用必须在定义时初始化,并且以后也要从一而终,不能再指向其他数据;指针没有这个限制,指针在定义时不必赋值,以后也能指向任意数据。

2、有const指针但没有const引用,因为 r 本来就不能改变指向,加上const是多此一举。

六、引用不能绑定到临时数据

指针就是数据或代码在内存中的地址,指针变量指向的就是内存中的数据或代码。这里有一个关键词需要强调,就是内存,指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘没法寻址。

其实 C++ 代码中的大部分内容都是放在内存中的,例如定义的变量、创建的对象、字符串常量、函数形参、函数体本身、new或malloc()分配的内存等,这些内容都可以用&来获取地址,进而用指针指向它们。

除此之外,还有一些我们平时不太留意的临时数据,例如表达式的结果、函数的返回值等,它们可能会放在内存中,也可能会放在寄存器中。一旦它们被放到了寄存器中,就没法用&获取它们的地址了,也就没法用指针指向它们了。

1.下面的代码演示了表达式所产生的临时结果:

int n = 100, m = 200;

int *p1 = &(m + n);    //m + n 的结果为 300

int *p2 = &(n + 100);  //n + 100 的结果为 200

bool *p4 = &(m < n);   //m < n 的结果为 false

这些表达式的结果都会被放到寄存器中,尝试用&获取它们的地址都是错误的。

2.下面的代码演示了函数返回值所产生的临时结果:

int func(){

    int n = 100;

    return n;

}

int *p = &(func());

func() 的返回值 100 也会被放到寄存器中,也没法用&获取它的地址。

相关推荐

  1. QTC++引用意义

    2024-04-10 01:04:03       31 阅读
  2. C语言malloc意义(附带源码)

    2024-04-10 01:04:03       54 阅读
  3. usingtypename在C++

    2024-04-10 01:04:03       32 阅读
  4. C++ STLQueueStack

    2024-04-10 01:04:03       35 阅读
  5. C++引用指针变量

    2024-04-10 01:04:03       54 阅读
  6. C++】C++extern

    2024-04-10 01:04:03       26 阅读
  7. C++指针、引用数组

    2024-04-10 01:04:03       49 阅读

最近更新

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

    2024-04-10 01:04:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 01:04:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 01:04:03       82 阅读
  4. Python语言-面向对象

    2024-04-10 01:04:03       91 阅读

热门阅读

  1. [ LeetCode ] 题刷刷(Python)-第70题:爬楼梯

    2024-04-10 01:04:03       36 阅读
  2. 大数据在医疗信息化中的应用

    2024-04-10 01:04:03       32 阅读
  3. 前端小白学习Vue2框架(一)

    2024-04-10 01:04:03       35 阅读
  4. 驾驭前端未来

    2024-04-10 01:04:03       33 阅读
  5. 大唐杯历届省赛押题训练(5)

    2024-04-10 01:04:03       30 阅读
  6. 【后端】OFD学习笔记

    2024-04-10 01:04:03       40 阅读
  7. 吴军《格局》对我的3点帮助

    2024-04-10 01:04:03       36 阅读
  8. 深入了解Linux: dbus-daemon系统总线的作用与管理

    2024-04-10 01:04:03       31 阅读
  9. Leetcode 165. 比较版本号

    2024-04-10 01:04:03       36 阅读