C++引用的属性
先看一段代码以及运行结果
#include <iostream>using namespace std;double cube(double a);
double recube(double &ra);int main()
{double x = 3.0;cout << cube(x);cout << " = cube of " << x << endl;cout << recube(x);cout << " = cube of " << x << endl;return 0;
}
double cube(double a)
{return a *= a * a;
}
double recube(double &ra)
{return ra *= ra * ra;
}
从该程序的运行结果可以看出,cube函数没有修改主函数中x变量,而recube函数修改了主函数的变量,其主要原因就是recube函数中使用了引用参数。如果在代码中不需要对主函数的变量进行修改,就需要使用const引用,double recube(const double &ra);限制对引用变量的修改。
在参数类型方面,按值传递的函数,其参数的传递可以是多种类型的实参,如表达式,常量值,数组元素。示例如下:
double x = 3.0;double xarray[] = { 3.0 ,2.0,1.0 };cout << cube(x+1);cout << cube(5);cout << cube(xarray[1]);
但是引用传递的函数中,对参数的类型限制比较严格,实参应该是一个变量。不能是一个表达式。不能是一个常量。下面看一个完整的示例
#include <iostream>using namespace std;double cube(double a);
double recube(double &ra);int main()
{double x = 3.0;double side = 3.0;double* pd = &side;double& rd = side;long edge = 1L;double lens[] = { 3.0 ,2.0,1.0 };cout << cube(x+1);cout << cube(5);cout << cube(lens[1]);cout << " = cube of " << x << endl;double c1 = recube(side);double c2 = recube(lens[1]);double c3 = recube(rd);double c4 = recube(*pd);//double c5 = recube(edge);//double c6 = recube(7.0);//double c7 = recube(side +10.0);cout << " = cube of " << x << endl;return 0;
}
double cube(double a)
{return a * a * a;
}
double recube(double &ra)
{return ra * ra * ra;
}
按照C++理论,这里存在一种可能性,就是当recube函数参数声明为const引用的情况下,在调用变量c5,c6,c7中,参数类型不匹配的情况下如dege是long类型,类型匹配不是变量的情况下如7.0和side+10.0编译器会生成一个临时匿名变量,并让ra执行其,这些临时变量旨在函数调用期间存在,以后编译器便可以随意将其删除。但是在测试期间编译器无法通过编译。也就是说不能生成临时变量,这一点让人很诧异(需要后续了解如何使用,并补充)。
double recube(const double &ra)
{return ra * ra * ra;
}
总结:
将引用参数声明为常量数据的引用有三个理由:
1.使用const可以避免无意中修改数据的编程错误;
2.使用const使函数能够处理const和非const实参,否则将只能处理非const数据。
3.使用const引用使函数能够正确生成并使用临时变量。