c++函数参数类型-引用

2024-05-30 04:08
文章标签 c++ 类型 引用 函数参数

本文主要是介绍c++函数参数类型-引用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数。这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身。

例如:

[cpp]  view plain  copy
 print ?
  1. void changeVar(int myVar,int newValue)  
  2.   
  3. {  
  4.   
  5.   myVar=newValue;  
  6.   
  7. }  
  8.   
  9. int main(){  
  10.   
  11. int myNum=20;  
  12.   
  13. changeVar(myNum,90);  
  14.   
  15. std::cout<<myNum<<endl;  
  16.   
  17. return 0;  
  18.   
  19. }  


结果为 20

出现这种情况的原因是:在调用changeVar()函数时,程序只是把main()函数中的myNum变量的值赋值给了changeVar()函数中的myVar变量,它们是两个不同的变量。事实上,changeVar()函数完全不知道在main()函数中还存在一个myNum的变量,甚至连它的名字都不知道。

解决方法:

通过使用地址和指针

绕开值传递问题的第一个方法是向函数传递变量的地址而不是它的值。

[cpp]  view plain  copy
 print ?
  1. int main()  
  2.   
  3. {  
  4.   
  5. int myNum=20;  
  6.   
  7. changeVar(&myNum,90);  
  8.   
  9. }  


当然,changeVar()函数也要相应的改动。

[cpp]  view plain  copy
 print ?
  1. void changeVar(int* myVar,int newValue){  
  2.   
  3. *myVar=newValue;  
  4.   
  5. }  


现在可以得到预期的结果90了。

这种交换在很多的排序算法里都要用到。

提示:有时候,向函数传递地址是让函数接收一个复杂数据类型的唯一方法。

 

引用传递方式向函数传递参数

既然像这样使用地址是一种很好的思路,让这个概念更加完善岂不是更好?如果事先知道某个函数只能接受一个地址,能不能按照某种套路来编写有关的代码以便在调用该函数时不需要使用特殊的语法呢?

引入引用传递方式输入参数。

引用的定义

int a = 100;

int& b = a;

b = 1000;

考察: (1)&a&b的关系? (2) a=?

b现在是a的一个别名! a=1000;

1)引用必须在声明时立即初始化,不允许空引用

2)引用一旦初始化,就不能再引用其它数据

3)引用和被引用的变量实际上代表同一个内存的数据 

引用的主要功能

传递函数的参数和返回值.C++中常用的方式有三种

值传递,指针传递和引用传递

引用传递的性质象指针传递,书写形式象值传递,

理由:如果只需要借用一下别名,就没必要用指针,.

void changeVar(int &myVar,int newValue);

这个函数第一个输入的参数不是一个指针,它是那个将被传递给这个函数的原始变量的一个别名。在changeVar()函数里对这个参数变量进行的任何操作都将反映在changeVar()函数外的那个原始变量身上。这意味着changeVar()函数与原来的一样。

void changeVar(int myVar,int newValue){

  myVar=newValue;

}

这使得这个函数更容易被调用----只需要提供一个变量名;

int main(){

int myNum=20;

changeVar(myNum,90);

}

这比值传参语法上更简单了。

引用传递”方式把参数值传递给一个函数是C++的新增功能,这可以让函数的调用语法更加简单清晰。

提示:1.在定义函数时,还可以让它以引用传递方式而不是以值传递方式返回: int &myFuntion();

           2.除了可以改变有关变量的值,引用传递方式的另一个好处是它的开销相对要小一些:因为不需要在函数里创建临时变量来容纳那些值,程序的内存占用量当然会小一些。

           3.如果想获得引用传递方式带来的性能改善,但不想改变某个变量的值,可以把相应的输入参数定义为一个常量:

 void myFunc(const int &myNum);

通过这样定义的函数,可以把具体的参数直接传递给它:myFunc(7);

 

这篇关于c++函数参数类型-引用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015540

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py