《C++ Primer Plus》学习随记3---引用变量



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;

}

顺利编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值