函数探幽之引用变量

1.将引用作为函数的形参有什么优点?
2.按值传递/按引用传递/按地址传递的区别?以交换函数为例。面对具体问题时该如何抉择?
3.为什么多数情况下应该用按值传递?
4.当实参和引用参数不匹配(因为实参形式多样)该怎么处理?
5.引用变量为什么更适合用于结构体?为什么?
8.2 引用变量
1.引用变量
1.1 功能
引用是已经定义的变量的别名。
主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据而不是其副本(常规变量做形式参数,接收实参的值,使用的是原始变量的副本)。这样除了指针外,引用也为函数处理大型结构(参数众多)提供了一种非常方便的途径。同时对于设计类来说,引用必不可少。
1.2 创建
int rats;
int & rodents = rates;
rodents ++; 将一个有两个名字的变量加1.
1.3 和指针对比//TODO

1.4 操作和使用
void swapr(int & a, int & b) // use references
{
int temp;
temp = a;
a = b;
b = temp;
}

1.5 临时变量、引用参数和const
当实参与引用参数不匹配时,C++将会生成临时变量。当前仅当形参为const引用时,C++才允许这样做。//为什么呢?这样一点都不能改变实参。好像不多,因为有临时变量。所以这个问题现在回答不了
具体情况如下:
(1)实参的类型正确,但不是左值。//什么是左值呢?在C语言中左值是出现在赋值语句左边的实体。但这是引入关键字const之前的情况。现在,常规变量和const变量都可以视为左值,因为可以通过地址访问它们。那么哪些数据对象可以作为左值呢?
答:左值参数是可被引用的数据对象,比如,变量,数组元素、结构成员、引用和接触引用的指针。而非左值包括字面常量(用括号括起来的字符串除外,它们由其地址表示)和包含多项的表达式
(2)实参的类型不正确,但可以转换为正确的类型。

创建临时的符合要求的匿名变量,来存储实参的值,并让形参中的const引用指向她。这有些类似按值传递。但是通用性更高。实参可以不符合类型,或者不是左值。

注意:应尽可能使用const
(a)使用const可以避免 无意中修改了数据 的编程错误
(b)使用const使函数能够处理const和非const实参,否则将只能接受非const数据
©使用const引用使函数能够正确生成并使用临时变量

1.6 将引用用于结构
1.6.1 引用和结构的
引用非常适合用于结构和类。确实,引入引用主要是为了用于这些类型的,而不是基本的内置类型。

1.6.2使用方式
eg:
假设有如下结构定义:
struct free_throws
{
std::string name;
int made;
int attempts;
float percent;
};
则可以这样编写函数原型,在函数中将指向该结构的引用作为参数:
void set_pc(free_throws & ft); // use a reference to a structure
void display(const free_throws & ft); // do not allow changes to structure


重要!重要!!重要!!!
personal总结:对于函数形参是用常规变量还是引用变量的选择:

如果 希望主调用函数中的实参发生改变,则用传引用调用,即将引用作为形参;
如果 希望主调用函数中的实参不被改变,则用传值调用或者const引用调用。而且对于不用创建临时变量的情况而言,选择const引用调用更能节省内存。

如果说函数调用是主调函数对被调函数的馈赠,那么函数返回值就是被调函数对主调函数的回报。

所以函数返回机制和传递参数的机制应该有类似的机制。
传统返回机制与按值传递函数参数类似。
eg:
double m = sqrt(16.0);//值4.0被复制到一个临时位置,然后被复制给m.
cout << sqrt(25.0);//值5.0被复制到一个临时位置,然后被传递给cout。
//为什么需要复制到一个临时位置呢?还不确定。可能需要通过汇编语言学习赋值运算的过程。

现在来看下面的语句:
dup = accumulate (team, five);
如果accumulate()返回一个结构,而不是指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup。但在返回值为引用时,将直接把team复制到dup,其效率更高。


1.6.3 返回引用时需要注意的问题
返回引用时最重要的一点是,应避免 返回函数终止时 不再存在的内存单元引用。

1.6.4 为何将const用于引用返回类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值