引用(reference)的优缺点(以int &b = a;为例)
- 1.引用的底层是指针:(b本质上是指向a的指针),但是程序员可以把引用b当作对象a的别名,也就是可以当作一个普通的变量使用。
- 2.引用有更加安全和高效的特性:b只能指向a,也就是说,b不能再引用其他的对象了,这一点和指针常量(指针常量指向的内存地址不可改变)类似。
- 3.引用也消除了拷贝对象带来的开销:以下面的代码为例,就可以看出引用传递的好处了。
- 4.引用一定是指向合法的对象,而使用指针之前要检查指针的值是否为NULL,指针指向的内存也有可能是非法的。
//引用传递,b是a的引用,一般占用8B大小的内存
void reference_func(ElementType &b);
//值传递,b是a的拷贝,占用和a一样的内存大小(4kB),这样就会大大的增加了程序的内存开销
void value_func(ElementType b);
int main(){
//假设一个ElementType的变量占用4kB
ElementType a = 10;
reference_func(a);
value_func(a);
return 0;
}
- 5.引用的缺点:引用定义的时候必须初始化,此外,引用缺乏灵活性,因为引用b一旦和对象a绑定了,那么b只能指向a。(注:一个对象可以有多个引用,但是一个引用变量只能引用一个个对象)
引用和指针联合使用:参数的传递如果是传递引用的话只使用 const refercence,把引用的作用限制在避免参数拷贝的开销上。然后把改变变量内容的任务交给指针
- 1.常引用:如const int &b = a; b是a的常引用,也就是不能通过b修改a。
- 2.将a的地址通过常引用b交给一个指针p,通过指针p访问a
- 3.好处:常引用降低内存开销,指针访问增加了灵活性。以以下代码为例
#include <iostream>
using namespace std;
void swap(const int &a, const int &b); //交换两个变量的值
int main() {
int a = 13, b = 29;
cout << "Before swap, a=" << a << ", b=" << b << endl; // 交换前a,b
swap(a, b);
cout << "After swap, a=" << a << ", b=" << b << endl; // 交换后a,b
return 0;
}
void swap(const int &a, const int &b) {
//&a是const reference,是用强制类型转换,转换为普通指针,然后赋值给p
int* p = (int*)&a; // 必须使用强制类型转换; p指向main函数中的对象a
int* q = (int*)&b; // 必须使用强制类型转换; q指向main函数中的对象b
int temp = *p;
*p = *q;
*q = temp;
}