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 也会被放到寄存器中,也没法用&获取它的地址。
推荐阅读
-
缩写 hse 的含义是什么_如何理解邮件中的 "CC、PS、FYI "和其他英文缩写?
-
C++ 中的类和对象 (I)
-
全面解释 python @property 的用法和含义
-
贪婪算法在 Python、JavaScript、Java、C++ 和 C# 中的多种实现及其在硬币变化、分数骑士、活动选择和使用哈夫曼编码的最小生成树问题中的应用实例
-
Java 中 next 和 nextline 的用法
-
[C++ Primer] 解释 C++ 和 C++ 中浮点数的有效数字
-
Linux 中 epoll 的原理和用法
-
枚举在 C++ 和 Java 中的用法
-
介绍枚举在 Java 开发中的作用和用法
-
C++ 中的多态性 - 多态性的条件和例外、重载 + 重写 + 重新定义