C++中的引用
E3`1、弄清楚什么是引用
1、引用(Reference,可以直译为参考)可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据
2、引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)(同时还有点指针常量的味道,即定义时必须初始化,然后不能再去引用其他变量)。
先看一段代码:
#include <iostream>
using namespace std;
int main() {int a = 99;int &r = a;cout << a << ", " << r << endl;cout << &a << ", " << &r << endl;return 0;
}
这里语句 int &r = a;就是对a的引用。查看代码运行的结果:
运行结果:
99, 99
0x28ff44, 0x28ff44
这里就可以看出来,
(1)这里的&不是取地址。这其实也很好理解,当&出现在等式的右边时,就会被认为是取地址符号,当&出现在等式左边,就可以认为是引用符号。
(2)从运行结果上看,r和a的地址都是一样的,说明编译器并没有给r另外开辟一个地址,我们根据代码一步一步来分解:
int a = 99; //为变量a分配内存
int &r = a; //不会为a分配内存
cout << a << ", " << r << endl; //后续代码中遇到a或r,直接调用为a分配的地址即可
cout << &a << ", " << &r << endl;
2、可以引用哪些类型
2.1 基本数据类型
C++ 的基本数据类型包括整型(int
、short
、long
、long long
等)、浮点型(float
、double
、long double
)、字符型(char
)、布尔型(bool
)等,这些类型的变量都可以通过引用进行关联。
2.2 指针数据变量的引用
直接看代码:
#include <iostream>
using namespace std; //这也构成了一条语句,末尾的“;”不能少
int main() {int* ptr = new int(5);int*& ptrRef = ptr; // 引用一个指针变量*ptrRef = 10; // 通过引用修改指针所指向的值cout << "*ptrRef: " << *ptrRef << endl; //输出 *ptrRef: 10std::cout << "*ptr: " << *ptr << endl; // 输出 *ptr: 10,另外这里的写法std::有点多余delete ptr;return 0;
}
int*& ptrRef = ptr; 引用指针变量时,&引用符号,要放在*号和变量名之间。
*ptrRef = 10; 和指针用法一致。
直接使用 ptrRef,则代表所存储开辟变量的地址。
2.3数组引用
还是直接看代码:
#include <iostream>
void printArray(int(&arr)[5]) { // 引用一个int类型的数组for (int i = 0; i < 5; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;
}
int main() {int myArray[] = {1, 2, 3, 4, 5};printArray(myArray); // 输出 1 2 3 4 5return 0;
}
引用作为形参时int(&arr)[5],其中拆解为以下几个点
(1)这个&arr是要被包含在()括号中的,
(2)方括号中和其中的数字5,也是必不可少的。相当于指定了数组的长度
(3)这里和数组指针作为形参时int* arr
或者 int arr[]是不一样的。
(4)模板函数中,这个形参不是必须要指定长度的的,这个暂时不清楚,还没学到模板函数
2.4 引用结构体和类类型
可以引用结构体对象或类的对象,在函数参数传递中使用结构体或类的引用,能避免对象的复制开销,提高效率,同时也能通过引用修改对象内部成员。
代码如下:
#include <iostream>
#include <string>
struct Person {std::string name;int age;
};
void updatePerson(Person& p) { // 引用一个Person结构体对象p.age++;
}
int main() {Person p = {"Alice", 25};updatePerson(p);std::cout << "Updated age: " << p.age << std::endl; // 输出 Updated age: 26return 0;
}
引用类对象与类对象不一样的地方在于,中间会加上&符号
3、引用的一些注意事项
(1)引用在定义时需要添加&
,在使用时不能添加&
,使用时添加&
表示取地址。(从上文的代码中也可以看出)
(2)引用声明时,也需要进行类型声明,如int
(3)引用也可以作为函数形参