首页 > 编程语言 >C++ 默认参数与引用传递:语法、用法及示例

C++ 默认参数与引用传递:语法、用法及示例

时间:2024-04-15 20:33:56浏览次数:29  
标签:函数 示例 C++ 默认 传递 int 参数 引用

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 函数有两个参数:fnameageage 参数拥有默认值 18,这意味着如果在调用函数时没有显式指定 age 参数,那么将使用 18 作为其值。

函数返回值和默认参数

默认参数仅适用于函数参数,不适用于函数返回值。函数的返回值类型由函数声明中的类型决定,与默认参数无关。

总结

C++ 中的默认参数是一种方便的功能,可以简化函数调用并提高代码的可读性。通过使用默认参数,您可以避免在每次调用函数时都需要显式指定所有参数,尤其是对于那些经常使用相同值的可选参数。

C++ 函数 - 引用传递

引用传递概述

在 C++ 中,函数参数可以使用引用传递的方式进行传递。引用传递是指函数直接访问函数调用者提供的变量的内存地址,而不是复制变量的值。这意味着函数可以直接修改调用者变量的值,而无需创建副本。

引用传递通常用于以下两种情况:

  • 需要在函数中修改调用者变量的值
  • 需要在函数中传递大型数据结构,例如数组或对象,以避免复制数据的开销

引用传递语法

引用传递的参数声明与普通参数声明类似,但需要在参数类型后面添加一个 & 符号。例如:

void swapNums(int &x, int &y);

在这个例子中,xy 是引用参数。这意味着函数 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 函数接收两个引用参数 xy。当调用 swapNums 函数时,它将直接访问 firstNumsecondNum 变量的内存地址,并交换它们的值。

引用传递与值传递的区别

特性 引用传递 值传递
参数类型 引用类型 (int&、string& 等) 普通类型 (int、string 等)
参数传递 直接传递变量的内存地址 复制变量的值
修改参数值 可以修改调用者变量的值 不能修改调用者变量的值
效率 通常比值传递更有效 通常比引用传递效率低

引用传递的注意事项

  • 引用传递的参数必须在函数调用之前进行初始化。
  • 不能将空指针或野指针作为引用传递的参数。
  • 引用传递的参数不能重新绑定到其他变量。

总结

C++ 中的引用传递是一种强大的功能,可以提高代码的效率和可读性。通过理解引用传递的语法、用法和注意事项,您可以编写更加简洁、高效的 C++ 程序。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

标签:函数,示例,C++,默认,传递,int,参数,引用
From: https://www.cnblogs.com/xiaowange/p/18136853

相关文章

  • C++_内存模型和函数以及类
    C++内存模型函数函数与编译器类成员变量class内部通过 static修饰变量时,表示该变量为静态成员变量,必须在类外定义 staticconst修饰变量时,表示该变量为静态成员常量,可以在类内初始化,或者在类外初始化 staticconstexpr修饰变量时,表示该......
  • 华为实习4.10机考第一题C++代码
    华为2024.4.10机考第一题C++代码第一题是一个关于字符串的模拟,但是对于C++来说,处理起来还是比较麻烦的。难点就是在输入时各字符串是用逗号分割的。#include<iostream>#include<unordered_map>#include<sstream>#include<vector>#include<algorithm>usingnamespacestd;......
  • 记录解决VS 2022调试C++ DLL项目时卡顿的问题
    项目结构运行时为DotNet6的C#通过Cli/C++去调用C++的DLL。问题表现在VisualStudio2022中调试C++DLL代码时,按下F5、F10、F11跳转到下一行时VS卡顿会2秒左右,体验非常不好。问题原因然后发现原因是项目的配置属性中,调试那一行,调试器类型选择的是“自动”。解决此问题的方法......
  • C++对象封装后的内存布局
    在C语言中,数据和数据的处理操作(函数)是分开声明的,在语言层面并没有支持数据和函数的内在关联性,我们称之为过程式编程范式或者程序性编程范式。C++兼容了C语言,当然也支持这种编程范式。但C++更主要的特点在支持基于对象(object-based,OB)和面向对象(object-oriented,OO),OB和OO的基础是......
  • C / C++ 文件简单混编 + 轻量级日志系统使用
    在项目工程里面,不一定全部是c或者c++文件,有时候是混合一起,这个时候如果使用makefile编译的话,就要考虑兼容两种类型的文件编译了;实战经验如下:根据自己的风格制作响应的打印和日志记录,makefile编写如下:CC=gccCPP=g++#文件夹路径ROOTPATH=.INCLUDE=-I./cfg/inc-I$(......
  • 9个MogDB存储过程示例
    9个MogDB存储过程示例本文出处:https://www.modb.pro/db/400634存储过程是一组结构化的查询和语句,例如控制语句和声明。这里介绍9个在不同情况下很有用的存储过程示例。创建测试表:createtablepublic.test1(idint,namevarchar(10));使用存储过程插入数据CREATEORR......
  • git默认忽略文件名称大小写
    0.现象当将文件名称test修改为Test时,git提交记录检测不到变化1.原因Git默认设置忽略文件名大小写是因为不同操作系统对文件名大小写的处理方式不同,为了避免在不同操作系统之间出现文件名大小写不一致的问题,Git默认忽略文件名大小写。2.修改默认不忽略gitconfigcore.ig......
  • C++数据结构和pb数据结构的转换
    1.C++topb1.1map嵌套对象结构 //pb数据结构messageInner{repeatedstringcodes=1;map<string,string>ext=2;};messageOuter{map<int32,Inner>uint2Inner=1;map<string,string>ext=2;};赋值代码:Outerreq;req.mu......
  • 第十五届蓝桥杯C++B组省赛总结
    A握手问题简单模拟,答案为:12045ptsB小球反弹数学,最重要的一点,不考虑反弹,一直让小球走,直到达到一个顶点,它就会反弹回去。所以问题就变成了扩展这些方块,直到满足小球的角度,让小球能达到另一个顶点。\(233333\times15a=343720\times17b\)解出来a和b就知道我们要延......
  • Android 11--设置第三方Launcher并默认 与 如何预置apk
    1.0Ver/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java+privatevoidsetDefaultLauncher(){+try{+finalPackageManagerpm=getPackageManager();++//StringdefPackageName="com.android......