C++ 默认参数与引用传递:语法、用法及示例
C++ 默认参数
默认参数概述
在 C++ 中,函数参数可以拥有默认值。这意味着,在调用函数时,如果省略了某个参数,那么将使用为该参数指定的默认值。
设置默认参数
默认参数值使用等号 = 符号进行设置,位于参数声明的类型之后。例如:
void myFunction(string country = "Norway");
在这个例子中,country 是一个参数,它的默认值为 "Norway"。这意味着,如果在调用 myFunction 时没有显式指定 country 参数,那么函数将使用 "Norway" 作为其值。
示例:使用默认参数
以下示例展示了如何使用默认参数:
void myFunction(string country = "Norway") {
cout << country << "\n";
}
int main() {
myFunction("Sweden"); // 输出:Sweden
myFunction("India"); // 输出:India
myFunction(); // 输出:Norway
myFunction("USA"); // 输出:USA
return 0;
}
在该示例中,myFunction 函数有两个调用:
- 第一次调用显式指定了参数
country为"Sweden",因此输出"Sweden"。 - 第二次调用显式指定了参数
country为"India",因此输出"India"。 - 第三次调用没有指定参数
country,因此使用默认值"Norway",输出"Norway"。 - 第四次调用显式指定了参数
country为"USA",因此输出"USA"。
多个参数和默认参数
函数可以拥有多个参数,其中一部分或全部都可以拥有默认值。例如:
void myFunction(string fname, int age = 18) {
cout << fname << " Refsnes is " << age << " years old.\n";
}
int main() {
myFunction("Liam"); // 输出:Liam Refsnes is 18 years old.
myFunction("Jenny", 25); // 输出:Jenny Refsnes is 25 years old.
return 0;
}
在这个例子中,myFunction 函数有两个参数:fname 和 age。age 参数拥有默认值 18,这意味着如果在调用函数时没有显式指定 age 参数,那么将使用 18 作为其值。
函数返回值和默认参数
默认参数仅适用于函数参数,不适用于函数返回值。函数的返回值类型由函数声明中的类型决定,与默认参数无关。
总结
C++ 中的默认参数是一种方便的功能,可以简化函数调用并提高代码的可读性。通过使用默认参数,您可以避免在每次调用函数时都需要显式指定所有参数,尤其是对于那些经常使用相同值的可选参数。
C++ 函数 - 引用传递
引用传递概述
在 C++ 中,函数参数可以使用引用传递的方式进行传递。引用传递是指函数直接访问函数调用者提供的变量的内存地址,而不是复制变量的值。这意味着函数可以直接修改调用者变量的值,而无需创建副本。
引用传递通常用于以下两种情况:
- 需要在函数中修改调用者变量的值
- 需要在函数中传递大型数据结构,例如数组或对象,以避免复制数据的开销
引用传递语法
引用传递的参数声明与普通参数声明类似,但需要在参数类型后面添加一个 & 符号。例如:
void swapNums(int &x, int &y);
在这个例子中,x 和 y 是引用参数。这意味着函数 swapNums 将直接访问调用者提供的变量的内存地址。
引用传递示例
以下示例展示了如何使用引用传递来交换两个变量的值:
void swapNums(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int firstNum = 10;
int secondNum = 20;
cout << "Before swap: " << firstNum << " " << secondNum << endl;
swapNums(firstNum, secondNum);
cout << "After swap: " << firstNum << " " << secondNum << endl;
return 0;
}
在该示例中,swapNums 函数接收两个引用参数 x 和 y。当调用 swapNums 函数时,它将直接访问 firstNum 和 secondNum 变量的内存地址,并交换它们的值。
引用传递与值传递的区别
| 特性 | 引用传递 | 值传递 |
|---|---|---|
| 参数类型 | 引用类型 (int&、string& 等) | 普通类型 (int、string 等) |
| 参数传递 | 直接传递变量的内存地址 | 复制变量的值 |
| 修改参数值 | 可以修改调用者变量的值 | 不能修改调用者变量的值 |
| 效率 | 通常比值传递更有效 | 通常比引用传递效率低 |
引用传递的注意事项
- 引用传递的参数必须在函数调用之前进行初始化。
- 不能将空指针或野指针作为引用传递的参数。
- 引用传递的参数不能重新绑定到其他变量。
总结
C++ 中的引用传递是一种强大的功能,可以提高代码的效率和可读性。通过理解引用传递的语法、用法和注意事项,您可以编写更加简洁、高效的 C++ 程序。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注
C++ 默认参数与引用传递:语法、用法及示例的更多相关文章
- 【Qt】信号和槽对值传递参数和引用传递参数的总结
在同一个线程中 当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象:(测试时,打印传递前后的地址不同) 引用传递不会复制对象:(测试时,打印传递前后的地址相同) 不在同一 ...
- 关于PHP参数的引用传递和值传递
如果希望编写一个名为increment()的函数来增加一个变量的值,我们可能会按如下方式编写这个函数: 这段代码是没有用的.下面测试代码的输出结果是“10”. $value 的内容没有被修改.这要归因 ...
- PHP函数参数的引用传递和值传递
函数的参数传递有两种方式 1,值传递 常见的 test($param) 方式就是值传递,在函数内部修改$param,不会影响外部变量$param的值 2,引用传递 参数是引用传递的方式,此时函数内部 ...
- Java中值传递的实质,形式参数与实际参数。引用传递。
值传递 package ch5; /** * Created by Jiqing on 2016/11/9. */ public class Transfer { public static void ...
- JAVA参数没有引用传递,只有值传递
原文章地址:http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性, ...
- C/C++(C++重载,默认参数,引用)
C++重载详解 重载就是同名而非同义,具体意义根据上下文的语境而言. 重载规则: 1,函数名相同. 2,参数个数不同,参数的类型不同,参数顺序不同,均可构成重载. 3,返回值类型不同则不可以构成重载. ...
- Java中参数的引用传递和值传递
1.一些定义 值传递:把实际传入参数的值,在内存中赋值一份 引用传递:传入的是实际参数的地址 2.传递基本类型的参数 因为Java是值传递,那就不难理解下面的代码不交换任何值 swap(Type ar ...
- JavaScript—之对象参数的引用传递
变量 1.JavaScript hoisting >>请看例子,我们拿Chrome的console作为JS的运行环境. 上面直接执行console.log(a), 不带一点悬念地抛出了no ...
- 转:《JavaScript—之对象参数的引用传递》
转自:博客园 Wayou http://www.cnblogs.com/Wayou/p/javascript_arguments_passing_with_reference.html 变量 1.Ja ...
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习
1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在 ...
随机推荐
- .net中最简单的http请求调用(比如调用chatgpt的openAI接口)
支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac. http请求调用是开发中经常会用到的功能,因为 ...
- (三)Git 学习之分支操作
一.分支简介 1.1 Git 分支初探 几乎所有的版本控制系统都会以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 假设你准备开发一个新功能,但是需要两周时 ...
- 3DCAD图纸转2D(DXF)图纸通用解决方案文稿
本文地址:https://gitee.com/dvaloveu/lovedva/issues/I6B5YC 视频演示(1.25倍速&原速):Acfun Bilibili 脚本地址:https: ...
- Docker常用基础命令详解
Docker常用基础命令详解 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 http://w ...
- 【转】客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析
原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...
- Mac安装Tomcat的Home路径
首先,强推mac上的一个软件Homebrew,安装好以后,再安装其他软甲就只是 "brew install 软件名"这么简单了. 正文: 我安装tomcat使用的是命令行操作的,也 ...
- CentOS 同时安装多个版本的Python3
1.背景 已安装了 Python3.6.4,需要再安装 Python3.9 版本 2.操作步骤 (1)寻找当前 Python3.9 版本最新稳定版的子版本 通过官网查找,目前为 3.9.18,下载到本 ...
- 如何利用云流送(Cloud Streaming)构造一个全三维、沉浸式的数字化虚拟景区
随着科技的发展,数字化虚拟景区已经离我们越来越近!所谓数字化虚拟景区,即利用现代计算机数字技术,模拟真实景区,实现在计算机和互联网上再现景区的真实场景. 数字化虚拟景区一般包含以下内容: 数字电子沙盘 ...
- 记录--居中为什么要使用 transform?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 引言 居中是我们在前端布局中经常会遇到的问题,其中包括水平居中和垂直居中.居中的方法很多,比如说水平居中可以使用text-align: c ...
- 记录--从原理分析vue开发环境搭建的全部过程
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 平时大家开发vue项目的时候,相信大部分人都是使用 vue-cli脚手架生成的项目架构,然后 npm run install 安装依赖,n ...