int rats;
int & rodents=rats;
rodents就是一个引用变量,他是rats的别名,指向相同的值和内存单元。
int & 是类型名。
引用变量必须在声明时将其初始化
引用变量一旦与某个变量关联起来,就将一直效忠于它,也就是没法再给引用变量赋其它值。
可以把“rodents”理解为指针的形式 int *const rodents=&rats。
引用变量用作函数参数:
我们用改变函数参数的值的程序来体现引用变量作为函数参数的作用
#include <iostream>
using namespace std;
void change(int &x);
int main()
{
int temp=20;
change(temp);
cout<<"temp="<<temp<<endl;
return 0;
}
void change(int &x)
{
x=30;
}
变量作为参数
void change(int x );
int main()
{
int temp=20;
change(temp);
cout<<"temp="<<temp<<endl;
return 0;
}
void change(int x)
{
x=30;
}
指针作为参数
void change(int *x );
int main()
{
int temp=20;
change(&temp);
cout<<"temp="<<temp<<endl;
return 0;
}
void change(int *x)
{
*x=30;
}
变量作为参数时,实参只是将他的副本(实参的值)给形参,改变形参并不会改变实参的值。
引用变量作为函数的参数时,就相当于给实参创建了一个别名。改变形参就是再改变实参的值。
引用变量做函数的返回值时
struct free_throws
{
std:string name;
int made;
int attempts;
float percents;
};
free_throws & accumulate(free_throws & target,const free_throws & source)
{
target.attempts+=source.attempts;
target.made+=source.made;
set_pc(target);
return target; // 返回一个 结构变量(引用变量类型)
}
如果返回的变量是引用变量类型,不能返回函数里创建的临时变量
free_throws & clone(free_throws & ft)
{
free_throws newguy;
newguy=ft;
return newguy;
}
newguy是函数创建的临时变量,函数执行完毕后就释放掉了
为什么要返回引用?
double m=sqrt(16.0);
sqrt函数返回结果 4.0 ,值4.0被复制到一个临时位置,然后被赋值给m
dup=accumulate(team,five);
accumulate()函数如果返回一个结构而不是引用变量,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup。而返回值为引用时,将直接把team复制到dup,效率更高。
这也就是当函数的返回值是引用变量类型时,为什么不能把函数里创建的临时变量作为返回值的原因。
而函数的形参在函数运行完毕后也会被释放,为什么team可以作返回值呢?
因为team是引用变量,是实参的别名,作为返回值时返回的就是实参(形参是引用变量时,实参不能是常量)。
free_throws & clone(free_throws &
ft)
{
free_throws & newguy;
newguy=ft;
return newguy;
}
只不过,这样newguy是ft的别名,而ft又是实参变量的别名,newguy也就是实参变量的另一个别名了(实参变量三个名字,真好)。
int & change(int & a);
int main()
{
int a=1;
int c;
c=change(a);
cout<<c;
return 0;
}
int & change(int & a)
{
int b=a;// b不声明为引用变量
b+=1;
return b;
}
会给出警告
int & change(int & a)
{
int & b=a;// b声明为引用变量
b+=1;
return b;
}
顺利编译