函数(C++)

    • 1.7 函数
      • 1.7.1 函数缺省参数
      • 1.7.2 哑元
      • 1.7.3 引用参数
      • 1.7.4 返回引用
      • 1.7.5 函数重载

1.7 函数

1.7.1 函数缺省参数

在C++中,函数的形参列表中的形参是可以有默认值的。有默认值的参数即为默认参数。

在函数调用时,有默认参数可以缺省。

语法:返回值类型 函数名 (参数= 默认值){函数体}

#include <iostream>
using namespace std;

int add(int x, int y, int z = 100) {
	return x + y + z;
}

int main(void) {
	
	cout << add(3, 3) << endl;		//106
	cout << add(3, 3, 4) << endl;	//10
	return 0;
}

注意事项:

  • 靠右原则:如果某个位置参数有默认值,那么从这个位置往后,从左往右,必须都要有默认值。
#include <iostream>
using namespace std;

int add(int x, int y = 100, int z) { //error
	return x + y + z;
}

int main(void) {
	
	cout << add(3, 3) << endl;
	cout << add(3, 3, 4) << endl;
	return 0;
}

  • 函数声明和函数实现(即函数定义),只允许其中一个有默认值,即如果函数声明有默认值,则函数实现的时候就不能有缺省参数。
#include <iostream>
using namespace std;

int add(int x, int y, int z = 100);//声明这有默认值了

int main(void) {
	
	cout << add(3, 3) << endl;
	cout << add(3, 3, 4) << endl;
	return 0;
}

int add(int x, int y, int z) { //定义这就不能再有了
	return x + y + z;
}

1.7.2 哑元

只有类型而没有变量名的参数成为“哑元”。

int func(int a, int ) {
    ……
}

需要使用哑元的场景:

  • 兼容旧代码,保证函数的向下兼容性
void func(int i, int j){...}==升级==>void func(int i){...}
void func(int i, int j){...}==升级==>void func(int i, int /*哑元*/){...}
  • 操作符重载中,区分前后++/- -

1.7.3 引用参数

  • 可以将引用用于函数的参数,这时形参就是实参的别名

  • 引用型函数参数作用

    • 在函数中修改实参的值

      #include <iostream>
      using namespace std;
      
      void swap(int &, int &) ;
      
      int main (void) {
      
      	int x = 100;
      	int y = 200;
      	swap(&x, &y);
      	cout << "x : " << x << "\t" << "y : " << y << endl;
          getchar();
      	return 0;
      }
      
      void swap(int &a, int &b) {
      	int temp = a;
          a = b;
          b = temp;
      }
      
      
    • 避免实参到形参数值复制的开销,提高传参效率

      #include <iostream>
      using namespace std;
      
      struct Teacher{
      	char name[100];
      	int age;
      };
      
      void print(Teacher &st){
      	cout << st.name << ',' << st.age << endl;
      }
      
      int main(void) {
      	Teacher st = {"王钢蛋", 18};
      	print(st);
      	return 0;
      }
      
  • 引用型函数参数可能意外修改实参,如果不希望通过引用修改实参本身,可以将其声明为常引用(const),在提高传参效率的同时还可以接收常量型实参

      #include <iostream>
      using namespace std;
      
      void add(const int &x, const int &y){
      	// x++; //error
      	cout << "x + y = " << x+y << endl;
      }
      
      int main (void) {
      	int x = 3, y = 5;
      	add(x,y);
      
      	return 0;
      }
      
    

1.7.4 返回引用

  • 可以将函数的返回类型声明为引用型,这时函数的返回结果就是return后面数据的别名,避免了函数返回值的开销

  • 函数中返回引用,一定要保证在函数返回以后,该引用的目标依然有效

    • 可以返回全局变量、静态变量和成员变量的引用
    • 可以返回引用型参数的本身
    • 可以返回调用对象自身的引用
    • 可以返回堆中动态创建的引用
    • 不能返回局部变量的引用 / 非常危险
    #include <iostream>
    using namespace std;
    
    int &add(int &a, int &b) {
    	int temp = 0;
    	temp = a+b;
    	return temp; //风险 局部函数结束时内存空间回收
    }
    
    int main(void) {
    
    	int x = 3, y = 5;
    	
    	int &t = add(x,y);
    	t++; //通过别名操作 已经被系统回收的内存
    	cout << t << endl;
    	return 0;
    }
    

1.7.5 函数重载

  • 基本作用

    同一作用域,函数名相同,但是当中的参数必须有所区分(类型、个数、顺序),将构成重载关系

    #include <iostream>
    using namespace std;
    
    void swap(int *a, int *b) {
    	cout << "a + b = " << *a + *b << endl;
    }
    
    void swap(char *a, char *b) {
    	cout << "a + b = " << *a + *b << endl;
    }
    
    
    void swap(float *a, float *b) {
    	cout << "a + b = " << *a + *b << endl;
    }
    
    int main(void) {
    
    	int a = 3, b = 5;
    	swap(&a, &b);
    	
    	char c1 = 'a', c2 = 'b';
    	swap(&c1, &c2);
    
    	float f1 = 3.1, f2 = 3.3;
    	swap(&f1, &f2);
    	return 0;
    }
    
  • 重载的实现

    编译器将形参变量的类型作为最终函数名的一部分。

    nm a.out
    

    在这里插入图片描述

    注意

    ​ 1)形参变量名不同 不构成重载的要素

    void swap(int *a, int *b);
    void swap(int *sa, int *sw); //形参变量名不同
    

    ​ 2)函数返回类型不同 不构成重载的要素

    int swap(int *a, int *b);
    void swap(float *a, float *b);//函数返回类型不同
    
  • 函数匹配的优先级

    当前g++编译器匹配的一般规则:

    1)完全匹配 //最高

    2)常量转换 //良好

    3)升级转换 //一般

    4)降级转换 //较差

    5)省略号匹配 //最差

    #include <iostream>
    using namespace std;
    
    void swap(int x) {
    	cout << "swap(int)" << endl;
    }
    
    void swap(int x, int y) {
    	cout << "swap(int, int)" << endl;
    }
    
    void bar(int c) {
    	cout << "bar(int)" << endl;
    }
    
    void bar(const char c) {
    	cout << "bar(const char)" << endl;
    }
    
    void foo(int f){
    	cout << "foo(int)" << endl;
    }
    
    void foo(char c) {
    	cout << "foo(char)" << endl;
    }
    
    void hum(int i, ...) {
    	cout << "hum(int...) " << endl;
    }
    
    void hum(int i, int j) {
    	cout << "hum(int, int)" << endl;
    }
    
    int main(void) {
    
    	int x = 10;
    	swap(x);
    
    	char c = 'a';
    	bar(c); // 常量转换 char -------> const char
    
    	short s = 10;
    	foo(s); // 升级转换 short --------> int
    
    	hum(2, 3.14); // 降级转换 double --------> int
    
    	return 0;
    }
    

注意二义性问题:

  • 默认类型转换带来的二义性

    void func(unsigned int x) {
    	cout << "func(unsigned int)" << endl;
    }
    
    void func(double x) {
    	cout << "func(double)" << endl;
    }
    
    
    	
    int j = 10;
    //func(j); //g++ 编译器不知道调用那个函数了 
    func((unsigned int) j);//需要程序员自己确认需要调用那个
    
  • 缺省参数带来的二义性

    void tem(int x, int y, int z = 200){
    	cout << "tem(int, int, int)" << endl;
    }
    
    void tem(int x, int y){
    	cout << "tem(int, int)" << endl;
    }
    
    
    
    tem(20, 30) //error 
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260083.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于Python里xlwings库对Excel表格的操作(十五)

这篇小笔记主要记录如何【获取单元格数据的对齐方式或更改单元格数据的对齐方式】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xf…

你想改win11系统中窗口、菜单等的字体? 微软不想让你改

如果你感觉win11系统中显示的字体不好看&#xff0c;想换。等一等&#xff0c;微软本不想让你改。 Windows 11 在默认情况下并没有提供直接修改系统默认字体的选项&#xff0c;而需要进行注册表或其他高级设置来更改系统字体。这可能是因为微软希望保持系统的一致性和稳定性&a…

Apache Flink(十七):Flink On Standalone任务提交-Standalone Application模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

【SQLite】SQLite数据库简单使用与Navicat安装-加密

Sqlite为免安装数据库&#xff0c;安装步骤总结&#xff1a; 官网下载Sqlit数据库&#xff0c;官网下载地址:https://www.sqlite.org/download.html 下载: sqlite-dll-win64-x64-3390400.zip或者32位sqlite-dll-win32 sqlite-tools-win-x64-3440200.zip或者32位sqlite-tools-wi…

idea 如何使用 JaCoCo 跑覆盖率

背景介绍 什么代码覆盖&#xff1f; 代码覆盖(Code coverage)是软件测试中的一种度量&#xff0c;描述程序中源代码被测试的比例和程度&#xff0c;所得比例称为代码覆盖率。简单来理解&#xff0c;就是单元测试中代码执行量与代码总量之间的比率。 Java常用的单元测试覆盖率…

微软 Visual Studio 迎来 AI 建议命名功能

目录 1微软 Visual Studio 迎来 AI 建议命名功能 2专访核桃编程CEO曾鹏轩&#xff1a;实操是掌握编程技能的唯一办法 1微软 Visual Studio 迎来 AI 建议命名功能 IT之家 12 月 19 日消息&#xff0c;使用付费 GitHub Copilot Chat 扩展的 Visual Studio Preview 用户&#xf…

Vue 2.5 入门学习记录

Vue 2.5 入门学习记录 1. 基础知识Vue 是什么Vue引入方式Vue特点Vue实例中的数据事件方法Vue中的属性绑定和双向绑定Vue中的v-if、v-show、v-fortoDoList制作局部组件&全局组件 2. vue-cli工程3. 工程案例实践使用vue-cli实现todoList及删除某个元素全局样式与局部样式 4. …

【K8s】#1使用kuboard-spray安装K8s集群

文章目录 搭建k8s集群1.推荐配置1.1.服务器配置1.2.软件版本 2.使用Kuboard-Spray安装k8s集群2.1.配置要求2.2.操作系统兼容性2.3.安装 Kuboard-Spray2.4.加载离线资源包2.5.规划并安装集群2.6.安装成功2.7.访问集群 3.涉及的命令3.1.linux 4.问题汇总Q1&#xff1a;启动离线集…

AI创作系统ChatGPT商业运营网站系统源码,支持AI绘画,GPT语音对话+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

2023 英特尔On技术创新大会直播 |AI小模型更有性价比

前言&#xff1a; 今年是引爆AI的一年&#xff0c;从幼儿园的小朋友到80岁的老奶奶都认识AI&#xff0c;享受AI带来的便捷&#xff0c;都在向市场要智能&#xff0c;但AI的快速发展离不开底层硬件设施的革新。 英特尔是全球知名的半导体公司&#xff0c;专注于计算机处理器和芯…

【C语言】指针详解(一)

目录 1.内存和地址 1.1内存 1.2如何理解编址 2.指针变量和地址 2.1取地址操作符&#xff08;&&#xff09; 2.2指针变量和解引用操作符&#xff08;*&#xff09; 2.2.1指针变量 2.2.2拆解指针类型 2.2.3解引用操作符 2.3指针变量大小 1.内存和地址 1.1内存 在讲内…

【Docker-4】Docker 命令

1、镜像管理命令 docker images #查看本机镜像 [rootdocker-0001 ~]# docker imagesdocker search 镜像名称 #从官方仓库查找镜像 [rootdocker-0001 ~]# docker search busybox #需要联网&#xff0c;本次不用操作docker pull 镜像名称:标签 #下载镜像 [rootdocke…

Observability:捕获 Elastic Agent 和 Elasticsearch 之间的延迟

在现代 IT 基础设施的动态环境中&#xff0c;高效的数据收集和分析至关重要。 Elastic Agent 是 Elastic Stack 的关键组件&#xff0c;通过促进将数据无缝摄取到 Elasticsearch 中&#xff0c;在此过程中发挥着至关重要的作用。 然而&#xff0c;显着影响此过程整体有效性的关…

英国呼叫中心的功能

随着互联网的普及和信息技术的发展&#xff0c;越来越多的企业需要通过呼叫中心来管理客户关系和提供售后服务。英国作为主要的海外外贸市场之一&#xff0c;也是呼叫中心面向客户服务的重要国家。 英国呼叫中心的功能 英国呼叫中心的功能大致分为四类&#xff1a;接听电话、…

DC-8靶场

目录 DC-8靶场链接&#xff1a; 首先进行主机发现&#xff1a; sqlmap得到账号密码&#xff1a; 反弹shell&#xff1a; exim4提权&#xff1a; Flag&#xff1a; DC-8靶场链接&#xff1a; https://www.five86.com/downloads/DC-8.zip 下载后解压会有一个DC-8.ova文件…

Flink(十)【处理函数】

前言 冬天学习成本太高了&#xff0c;每天冻得要死&#xff0c;自习室人满为患&#xff0c;确实是辛苦。学校基本的硬件条件差的一批&#xff08;图书馆贼小贼偏僻、老教室暖气还没有地板热、空教室还得自己一个一个挨着找&#xff09;&#xff0c;个体无法改变环境只能顺应了&…

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

一、本文介绍 本文给大家带来的改进机制是MobileNetV1&#xff0c;其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构&#xff0c;并利用深度可分离卷积构建轻量级深度神经网络&#xff0c;其引入了两个简单的全局超参数&#xff0c;用于在延迟和准确…

数字图像处理 基于Numpy、PyTorch在频率空间中建模运动模糊

一、简述 运动模糊在图像中很常见,它会降低图像的价值,因为它会破坏图像中包含的数据。在计算机视觉中,通常通过使用许多不同的模糊增强来训练神经网络以适应这种模糊。建模模糊或图像退化的概念来自图像恢复,这是逆转退化影响的过程,以便人类或算法可以辨别原始捕获的数据…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …

Linux c++开发-11-Socket TCP编程简单案例

服务端&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <sys/types.h>#include <errno.h>int main(void) {//1.socketint server_sock socket(A…