当前位置: 首页 > news >正文

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引用使函数能够正确生成并使用临时变量。


http://www.mrgr.cn/news/61549.html

相关文章:

  • TIOBE编程语言排行靠前的编程语言的吉祥物
  • 【STM32】LED状态翻转函数
  • 并行服务、远程SSH无法下载conda,报错404
  • 探秘MetaGPT:革新软件开发的多智能体框架
  • 【Rust自学】11.5. 在测试中使用Result<T, E>
  • 前端依赖安装指南
  • 如何在 CentOS VPS 上设置系统监控的邮件警报
  • 嫉妒经济学:揭秘消费行为背后的情绪驱动力
  • LeetCode Hot 100:技巧
  • WPF+MVVM案例实战(十二)- 3D数字翻牌计时实现
  • 信息安全数学基础(34)正规子群和商群
  • 加强版 第四节联通组件分析与演示
  • netframework安装不上怎么办
  • LeetCode 热题 100 回顾8
  • Java——lambda表达式和StreamAPI
  • AI-Talk开发板之启动问题
  • Windows 下实验视频降噪算法 MeshFlow 详细教程
  • Java学习第六天~第七天-程序控制结构:
  • 《操作系统真象还原》第4章 保护模式入门
  • 使用Node.js内置的http模块创建简单的HTTP服务器,并根据请求的路径返回不同的文本响应。
  • LeetCode 3211.生成不含相邻零的二进制字符串:二进制枚举+位运算优化
  • 计算机毕业设计——ssm基于HTML5的互动游戏新闻网站的设计与实现录像演示2021
  • modelsim命令:add atv
  • 【Java数据结构】树】
  • 基于SSM积分商城管理系统的设计与实现(源码+lw+部署文档+讲解等)
  • 小红书图文无水印下载