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

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.