引用非常适合用于结构和类,使用结构引用参数的方式与使用基本变量引用相同,只需在声明结构参数时使用引用运算符&即可。
struct free_throws {
string name;
int mode;
int attempts;
float percent;
};
void display(const free_throws &ft);
void set_pc(free_throws &ft);
free_throws & accumulate(free_throws &target,const free_throws &source);
int main(){
free_throws one = {"aaa",13,14};
free_throws team = {"eeee",0,0};
set_pc(one);
display(one);
accumulate(team,one);
display(team);
display(accumulate(team,one));
}
void display(const free_throws &ft){
cout << ft.name << endl;
cout << ft.mode << endl;
cout << ft.attempts << endl;
cout << ft.percent << endl;
}
void set_pc( free_throws &ft){
if(ft.attempts!=0)
ft.percent = 100.0f*float(ft.mode)/float(ft.attempts);
else
ft.percent = 0;
}
free_throws & accumulate(free_throws &target,const free_throws &source){
target.attempts += source.attempts;
target.mode += source.mode;
set_pc(target);
return target;
}
set_pc方法需要修改结构体中成员percent,所以需要传递引用,然后调用display显示各个成员的值,由于不需要修改,所以定义为const引用。accumulate函数需要修改第一个参数,并且返回的是第一个参数的引用。display函数把结构体信息打印出来。
如果accumulate返回类型被声明为free_throws而不是free_throws&,上述返回语句将返回target(也就是team)的拷贝。
为什么accumulate要返回引用?
free_throws dup = accumulate(team,one);
如果accumulate()返回一个结构,而不是指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup。但在返回值为引用时,将直接把team复制到dup,其效率更高。
返回引用时最重要的一点是,应避免返回函数终止时不再存在的内存单元引用。
const free_throws & clone(free_throws &ft){
free_throws newguy;
newguy = ft; //这里会把ft的内容拷贝到newguy
return newguy; //返回后newguy内存不存在
}
为避免这种问题,最简单的方法是,返回一个作为参数传递给函数的引用。作为参数的引用将指向调用函数使用的数据,因此返回的引用也将指向这些数据。
标签:ft,target,c++,free,引用,accumulate,throws,结构 From: https://blog.51cto.com/u_3764469/6083893