付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、二.参数传递函数的形参的初始化和变量的初始化一样,如果形参具有非引用类型,则复制实参的值, 如果形参为引用类型,则它是实参的别名。1.非引用实参普通的非引用类型的函数通过复制对应的实参实现初始化。当用实参副本初始化形参时, 函数并没有调用所传递的实参本身,因此不会修改实参的值。注解:非引用形参表示对应实参的局部副本,对这类行参的修改仅仅改变了局部副本的值,一旦函数执行结束,这些局部变量的值也就没有了。a. 指针形参指针形参与其他非引用类型的行参一样,如果将新指针赋给行参,主调函数使用的实参指针的值没有改变。事实上被复制的指针只影响对指针的赋值。指针形参是const类型还是非const类型,将影
2、响函数调用所使用的实参。b. const 行参在调用函数时,如果该函数使用非引用的非const形参,则既给该函数传递const实参也可传递非 const的实参(因为改变形参不影响 const的实参,所以 const实参不会被改变)。如 果将形参定义为非引用的const类型,则在函数中,不可以改变实参的局部副本,由于实参是以副本的形式传递,因此传递给函数形参既可是const也可是非 const对象。注意:尽管函数的形参是const,但是编译器却将该行参声明视为普通的int型。void fcn(const int i);void fcn(int i);为了兼顾 C 语言,认为这两种定义并不区别。c
3、. 复制实参的局限性不适合复制实参的情况包括:当需要在函数中修改实参的值时当需要以大型对象作为实参传递时,对实际的应用而言,复制对象所付出的时间和存储空间代价往往很大。但没有办法实习对象的复制时对于以上几种情况,有效的办法是将形参定义为引用或指针。2.引用实参与所有引用一样,引用形参直接关联到其所绑定的对象,而并非这些对象的副本。定义引用时,必须用与该引用绑定的对象初始化该引用。引用形参以完全相同的方式工作。每次调用函数时,引用形参被创建并与相应的实参关联。a. 使用引用形参返回额外的信息函数只能返回单个值, 但有时候函数有不止一个的内容需要返回。这时候我们可以通过函数传递一个额外的引用实参,
4、用于返回额外的信息。b. 利用 const引用避免复制对于大型对象复制效率太低了, 有些类型甚至无法复制,利用 const 引用就可以避免复制, 引用形参是引用,所以不复制实参,又因为形参是const引用,所以不能使该引用来修改实参。c. 更灵活的指向 const的引用如果函数具有普通的非const弓 I 用形参,贝 U 不能通过const对象进行调用,因为函数可以修改传来的参数,但这样就违背了实参的const特性。int incr(int &val)(return +val;int main()(short v1=0;const int v2=42;int v3=incr(v1);
5、/error, v1 不是整型v3=incr(v2); /error, v2 使 const 对象v3=incr(0); /error,字面值不是左值v3=incr(v1+v2); /error,加法不能作为左值int v4=incr(v3); /ok, v3 是一个非 const 的整型值问题的关键是非 const引用形参只能与完全相同的非const对象关联。最佳实践:应该将不需要修改的引用定义为const引用。普通的非 const引用形参在使用时不太灵活。这样的形参既不能被 const对象初始化,也不能用字面值或产生右值的表达式 初始化。d.传递指向指针的引用实现两个指针的交换:void
6、ptrswap(int* &v1, int* &v2)(int* temp=v2;v2=v1;v1=temp;行参 int* &val 的定义从右向左理解:v1是一个引用,与指向 int型对象的指针相关联。也就是说,v1只是传递进 ptrswap 函数的任意指针的别名。3.vector和其他容器类型的行参最佳实践:通常,函数不应该有 vector或其他标准容器库类型的实参。调用含有普通的非引用 vector行参的函数将会复制 vector的每一个元素。从避免复制 vector 的角度出发,应考 虑将形参声明为引用类型。4.数组形参a. 数组形参的定义数组会被自动转换为指
7、针,通常,将数组形参直接定义为指针要比数组语法更好,这样就明确的表示,函数操纵是指向数组元素的指针,而不是数组本身。当编译器检查数组形参关联的实参时,他只会检查实参是不是指针,指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。b. 数组实参和其他类型一样,数组形参可定义为引用或非引用类型,大部分情况下,数组以普通的非引用类型传递,此时数组会转换为指针。最佳实践:当不需要修改数组形参的元素时,函数应该将形参的定义为指向const对象的指针。c. 通过引用传递数组与其他类型一样, 数组形参可以声明为数组的引用,如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身,在
8、这种情况下,数组的大小成为形参和实参的一部分。编译器检查数组实参的大小与形参的大小是否匹配。void print(int (&arr)10) ; /形参是一个数组的引用,数组的大小确定int main()(int i=0,j2=0,1;int k10=0,1,2,3,4,5,6,7,8,9;print(&i); /error,参数不是 10个整型元素的数组print(j) ; / error,参数不是 10个整型元素的数组print(k); /ok,参数是 10个整型元素的数组。注解:&arr 两本的括号是必须的,因为下标操作具有更高的优先级f(int &arr
9、10) /error,arrs是一个含有 10个引用的数组f(int (&arr)10) /ok, arr 是一个引用,他和一个含有10个元素的数组关联d.多维数组的传递C + +没有多维数组,所谓多维数组实际就是指数组的数组。除了第一维以外的所有维的 长度都是元素类型的一部分。5.传递给函数的数组的处理任何数组的处理程序都要保证程序停留在数组的边界内。a. 使用标准库规范,传递指向数组的第一个元素和最后一个元素的下一个位置的指针。这中技术风格由标准库的技术启发而得。b. 显式传递表示数组大小的形参void print(const int ia, size_t size);6. main :处理命令行选项7. 含
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 蓝色卡通风世界读书日主题
- 注册会计师审计中风险评估重大错报风险的识别技巧
- 某服装厂质量控制管理制度
- 电器厂生产安全条例
- 下篇 模块五 工业机器人标准及性能指标
- 2026广东东莞厚街社区招聘社区网格员2人备考题库附参考答案详解(培优b卷)
- 2026江西赣州市政公用集团社会招聘39人备考题库及答案详解【网校专用】
- 2026四川宜宾汇发产业新空间投资有限公司第一批员工招聘5人备考题库附参考答案详解(培优a卷)
- 某玻璃制造厂产品质量控制要求
- 2026洞头海霞青年营度假酒店招聘5人备考题库(浙江)及答案详解【典优】
- 2025年wset三级题库及答案
- 2025年高考物理电磁学专题训练解题技巧与真题试卷及答案
- 2026春教科版(新教材)小学科学三年级下册《发光发热的太阳》教学课件
- GB/T 31458-2026医院安全防范要求
- 乡镇卫生院医保审核制度
- 统编版(2024)八年级下册历史期末复习全册知识点提纲详细版
- 物业新入职员工安全培训课件
- 《DLT 5428-2023火力发电厂热工保护系统设计规程》专题研究报告深度
- 2026年南阳农业职业学院单招职业技能测试题库及答案详解1套
- 2025年甘肃省中考英语试卷真题(含标准答案及解析)
- 广州市中心城区自行车交通系统发展策略研究报告
评论
0/150
提交评论