什么是引用
引用其实就是变量的别名,在C++中,它主要用作函数形参,于是函数可以修改传入参数的原始数据,而不在是数据的副本。
引用与指针
如果函数参数声明为指针,其实也可以操作原始数据,如下
#include <iostream>
struct Person
{
std::string name;
};
void changeName(Person & person)
{
// 因为引用是变量的别名,因此可以使用点号来访问结构变量
person.name = "David";
}
void changeName1(Person * person)
{
person->name = "Frank";
}
int main()
{
Person p = {"Unknown"};
changeName(p);
std::cout << "After changeName: name = " << p.name << std::endl;
changeName1(&p);
std::cout << "After changeName1: name = " << p.name << std::endl;
return 0;
}
可以发现使用引用参数,在调用的时候方便一些,直接传入变量名即可,而不用传入变量的地址。这也是C++对C指针改进的一个地方。
引用参数的注意事项
声明引用参数时,只有一个注意事项: 如果没有绝对的理由需要修改原始数据,那么就将引用参数设置为 const 。
否则可能会触发一些编译问题(例如传入变量类型不匹配,导致编译不过)或使用问题(例如无意间修改了原始数据)。
将引用用于函数返回类型
如果函数返回一个引用类型的变量,要注意不要将返回的引用变量指向不存在的内存
Person & changeName(Person & p)
{
Person temp;
p.name = "David"; // 修改原始数据
temp = p; // 拷贝信息
return temp;
}
temp 变量的内存在函数结束后,会被释放,因此返回 temp 变量的引用将会指向一个无效内存,这将导致编译错误。
如果函数必须返回一个引用类型的变量,可以将传入的引用参数返回
Person & changeName(Person & p)
{
p.name = "david";
// 返回引用参数,安全
return p;
}
什么时候使用引用
指针和引用都有两个作用
- 可以修改原始数据。
- 引用参数或指针参数,可以提高程序的运行速度。因为它们都不执行数据复制操作。
那么什么使用引用参数,什么时候使用指针?
一个原则: 在C++中,如果函数要修改参数的原始数据,就使用引用。