引用(二)
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引用使函数能够生成并使用临时变量
相关文章推荐
- 第八章 工厂方法模式
- 19 字符数据及字符类型 项目 (1- 字母及其编码 ) (2- 能对齐的数据)
- (2) Hive 数据导入方式
- CSS之元素相关
- 基于IAP15F2K61S2的带文件系统的微型操作系统
- linux 获取本机 ip 地址
- Android之获取数据库路径
- ZOJ 3710 Friends【floyd思想递推】
- Android和“时间”有关的一些常用函数
- 三角函数之美-水波纹加载LoadingView
- css的特殊选择器 nth-child
- 自勉
- maven 自建库
- 句柄
- mac配置git环境
- HttpClient设置请求头
- 20160402系统集成管理工程师(test3)
- 《Linux keepalived与lvs的深入分析》三之负载调度算法
- 痛苦的vsftpd配置
- HTTP总结