定义
- 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字,一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
引用和指针
- 上面是引用的常见定义,虽然很好理解,但是初次接触以及实际使用时很容易令人产生困惑:“引用与指针是什么关系?C++既支持指针也支持引用那么实际编程中什么情况下应该使用引用,什么情况下应该使用指针?”
个人理解
- 指针是计算机中真实存在的原始元素,而引用是对指针的抽象元素。
- 引用的底层实现其实也是指针,但是引用是指针的抽象概念,抽象出引用的目的是避免指针使用的一些缺陷,引用的实现限制了指针的部分使用方式,指针使用非常自由,而引用牺牲掉了部分自由换来了稳定和方便。
- 指针和引用并不是并列关系,引用是指针的更高层次元素,并不一定要同时存在,例如java就完全去掉了指针的支持。
- 引用相对于指针并不全是优势,例如:指针比引用更自由;但是引用更适合现实应用的稳定和快速开发。
引用的实现原理
- 引用底层实现也是指针,由编译器做使用转换,具体的验证可以在网上找到很多对引用进行反汇编的博客。
引用与指针的使用差异
- 不存在空引用,引用必须连接到一块合法的内存,防止了出现空指针异常。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象,防止了野指针问题。
- 指针可以在任何时候指向到另一个对象和在任何时间初始化而引用必须在创建时被初始化,防止了指针乱飞。
使用
声明定义
int i;
int & r = i;
使用方式
引用普通变量
int i;
int & r = i;
r = 100;
std::cout << r << std::endl;
把引用作为参数
void test(int& x, int& y){
x = 10;
y = 100;
}
int main(int argc, char **args){
int a = 100;
int b = 200;
test(a, b);
....
}
把引用作为返回值
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues(int i){
return vals[i]; // 返回第 i 个元素的引用
}
setValues(3) = 70.8;
- 注意:返回一个引用时,被引用的对象不能超出其作用域。返回一个局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用。