看过很多博客说引用是不开辟内存的,但经过实践,这一说法太过于表面。我通过代码转到反汇编,发现有开辟形参压栈的过程:
#include <iostream>
int sum(int& a,int& b)
{
return a+b;
}
int main()
{
int a = 10;
int b = 20;
int s = sum(a,b);
std::cout<<sum<<std::endl;
return 0;
}
不过这些细节没有深究,作为一个疑问保留了下来,等待以后研究。
下来正式谈谈引用,引用分表层和深层两个意思:
1.表层:变量或函数返回值的别名
2.深层:指针
例如:
int a = 10;
int b = 20;
int& c = a;
可以直接使用c来表示a,c=20也就是a=20。
他在这个过程中自动做了一次类似于指针的解引用,因此,我们无法对c取地址,也无法对c重新赋值:
下面通过简单的例子来深入理解引用:
int main()
{
int a = 10;
int &b = a; //正确:b引用a
//int &c = 20; //错误,引用了一个常量,当对c进行操作时,即对20进行操作,这是不允许的
const int &c = 20; //正确:const修饰c,不能许c做修改操作
const int a = 10;
const int& b = a; //正确
int a = 10;
const int &b = a; //正确
int a = 10;
int *p = &a;
int* &q = p; //正确,相当于对p进行操作
int a = 10;
int *p = &a;
const int* &q = p; //错误,q类型为const int *,而p为int *,应该给int *p前面加const
int a = 10;
int * p = &a;
int* const &q = p; // 正确
return 0;
}