引用,就是给已经存在的变量取别名。
编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
例如:李逵,AKA“铁牛”“黑旋风”,都是同一个人
类型& 引用变量名(对象名)=引用实体
引用类型必须和引用实体是同种类型的;
int main()
{
int a = 10;
int& ra = a;
printf("%p\n", &a);
printf("%p\n", &ra);
return 0;
}
?
错误写法:
先初始化变量,再const引用 常量
using namespace std;
int main()
{
//(1)变量初始化,再const引用 变量
int b = 10;
const int& a = b;
b = 11;//b是可以修改的,但是a不能修改
printf("a=%d,b=%d\n", a, b);
return 0;
}
const引用常量
using namespace std;
int main()
{
//(2)const引用 常量
const int& c = 15;
//编译器会给常量15开辟一片内存
//并将引用名作为这片内存的别名
//int &d=15//err
cout << c << endl;
return 0;
}
using namespace std;
void Swap1(int* a, int* b)
//传值
{
int temp = *a;
*a = *b;
*b = temp;
}
void Swap2(int& a, int& b)
//传引用
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 23; int b = 45;
cout << "传值:" << endl;
cout << "a = " << a << " " << "b = " << b << endl;
Swap1(&a, &b);
cout << "a = " << a <<" " << "b = " << b << endl;
int c = 66; int d = 99;
cout << "传引用:" << endl;
cout << "c = " << c << " " << "d = " << d << endl;
Swap2(c, d);
cout << "c = " << c << " " << "d = " << d << endl;
return 0;
}
如果函数返回时,出了函数作用域:
如果返回对象还在(还没有还给系统,eg:static),则就可以使用引用返回;
如果已经还给了系统,必须使用传值返回。
int& Count()
{
static int n = 0;
n++;
// ...
return n;
}
int main()
{
int n = Count();
cout << "n is :" << n << endl;
return 0;
}
?
using namespace std;
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
cout << "Add(1, 2) is :" << ret << endl;
int& ret2 = Add(3, 4);
cout << "Add(3, 4) is :" << ret2 << endl;
return 0;
}
以值作为参数或者返回类型时:
在传参和返回期间,函数不会直接传递实参或者变量本身直接返回,而是传递实参或者返回变量的一份临时拷贝,因此此时效率是低下的,尤其是参数或者返回类型非常大时。
语法概念上,引用就是一个别名,没有独立空间,和其他引用实体公用同一块空间;
底层实现上,引用实际是有空间的,因为引用是按照指针方式来实现的。