您的位置:首页 > 其它

引用(二)

2016-04-02 18:11 183 查看
///1.引用的属性和特别之处
///下面是一个计算立方的程序:
#include<iostream>
using namespace std;
double cube(double a)
{
a *= a * a;
return a;
}
double refcube(double &ra)
{
ra *= ra * ra;
return ra;
}
int main()
{
double x = 3.0;

cout << cube(x);
cout << " = cube of " << x << endl;
cout << refcube(x);
cout << " = cube of " << x << endl;
return 0;
}
/*
27 = cube of 3
27 = cube of 27

Process returned 0 (0x0)   execution time : 8.548 s
Press any key to continue.
*/
///对于该程序需要注意几点:
///1).变量a位于cube()中,他被初始化为x的值,但修改a并不会影响x.
///2).由于refcube()使用了引用参数,因此修改ra实际上就是修改x.
double refcube(const double &ra);
如果这样做,当编译器发现代码修改了ra的值时,将生成错误消息
要编写像上面这样的程序,应该采用按值传递的方式,而不要采用按引用传递的方式。
按值传递的函数,如cube(),可使用多种类型的实参,下面的调用都合法:
double z = cube(x + 2.0);
z = cube(8.0);
int k = 10;
z = cube(k);
double yo[3] = {2.2, 3.3, 4.4};
z = cube(yo[2]);
传递引用的限制更加严格。
若ra是一个变量的别名,则实参应该是该变量。
double z = refcube(x + 3.0) 是不合理的,因为 x+3.0 并不是变量,例如,不能将值赋给该表达式;
x+3.0 = 5.0;///nonsensial
2.临时变量,引用参数和const
若实参与引用参数不匹配,C++将生成临时变量。仅当参数为const引用时,C++才允许这样做。
若引用参数是const,则编译器将在下面两种情况下生成临时变量:
1)实参的类型正确,但不是左值
2)实参的类型不正确,但可以转换为正确的类型。
左值参数是可被引用的数据对象,例如,变量、数组元素、结构成员、引用和被解除引用的指针都是左值。
非左值包括字面常量和包含多项的表达式。
例如,我们可以重新定义refcube(),是只接受一个常量引用参数:
double refcube(const double & ra)
{
return ra * ra * ra;
}
现在考虑下面的代码:
double side = 3.0;
double * pd = &side;
double & rd = side;
long edge = 5L;
double lens[4] = {2.0, 5.0, 10.0, 12.0};
double c1 = refcube(side);///ra is side
double c2 = refcube(lens[2]);/// ra is lens[2]
double c3 = refcube(rd);///ra is ra is side
double c4 = refcube(*pd);///ra is *pd is side
double c5 = refcube(edge);///ra is temporary variable
double c6 = refcube(7.0);///ra is temporary variable
double c7 = refcube(side + 10.0);///ra is temporary variable
参数side,lens[2],rd和*pd都是有名称的,double类型的数据对象,因此可以为其创建引用,而不需要
临时变量。edge虽然是变量,类型却不正确,double引用不能指向long.而且参数7.0和side+10.0的类型
都正确,但没有名称,这些情况下,都将生成一个临时匿名变量,并让ra指向他,这些临时变量旨在函数
调用期间存在,此后编译器将其随意删除。
对于引用(一)中交换数值的程序中,void swapr(int &a, int &b)
若执行操作:
long a = 3, b = 5;
swapr(a, b);
由于类型不匹配,编译器将创建两个临时的int变量,将它们初始为3和5,然后交换临时变量将阻止这种意
图的实现。解决方法是禁止创建临时变量。我们的refcube()函数只是使用传递的值,而不是修改它们。
因此临时变量不会造成任何不利的影响,反而会使函数在可处理的参数种类方面更通用。因此,若声明将引
用指定为const,C++将在必要时生成临时变量,实际上,对于形参为const引用的C++函数,若实参不匹配,
则其行为类似于按值传递,为确保原始数据部被修改,将使用临时变量来存储值。
***若函数调用的参数不是左值或与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量
并让参数来引用该变量。
****应尽可能使用const:
1)使用const可以避免无意中修改数据的编程错误
2)使用const是函数能够处理const和非const实参,否则将只能接受非const数据
3)使用const引用使函数能够生成并使用临时变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: