初谈C++:缺省参数函数重载

2024-01-31 10:04

本文主要是介绍初谈C++:缺省参数函数重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

  • 缺省参数
    • 概述
    • 缺省参数的分类
      • 全缺省
      • 半缺省参数
    • 注意
  • 函数重载
    • 概述
    • 重载类型不同
      • 参数类型不同
      • 参数个数不同
      • 参数类型顺序不同
  • C++支持函数重载的原理

缺省参数

概述

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

举例:

void fun(int a = 5)
{cout << a << endl;
}int main()
{fun(10); //传参,使用指定的参数-->10fun(); //没有传参,使用参数的默认值return 0;
}

在这串代码中,在fun函数中有一个形参int a = 5,主函数中,fun(10),传了参数,于是在fun函数中就是用传的参数;而fun()中没有传参数,就是用参数的默认值。

输出结果:

10
5

在这里插入图片描述

缺省参数的分类

全缺省

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}int main()
{Func();return 0;
}

结果:

a = 10
b = 20
c = 30

主函数中Func()没有任何参数,则全部使用缺省值。

半缺省参数

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{Func(1, 2, 3);Func(1, 2);Func(1);return 0;
}

结果:

a = 1
b = 2
c = 3a = 1
b = 2
c = 30a = 1
b = 20
c = 30

在这里插入图片描述
半缺省参数必须从右往左依次来给出,不能间隔着给

Func(1, 2)是给了第一个参数和第二个参数值,,而没有给第三个参数值
Func(1)只给第一个参数传了值
不存在只给第一个参数和第三个参数传值的说法,这种是错误的,只能从左至右一次给出。

注意

  • 缺省参数不能在函数声明和定义中同时出现
//test.h
void Func(int a = 10);
// test.cpp
void Func(int a = 20)
{}

如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值

  • 缺省值必须是常量或者全局变量

函数重载

在汉语中,一个词语会有多种意思,人们可以结合语境可以判断一个词的意思。如“方便”一词:”你现在方便嘛”、“我要去方便一下”。

概述

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

重载类型不同

参数类型不同

int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{cout << Add(2, 3) << endl;cout << Add(2.0, 3.0) << endl;
}

运行结果:

在这里插入图片描述

函数名称同为Add,但是定义此函数的类型不同,一个是int,另一个是double,在主函数中调用的Add函数,如果传的参数为int型,那么调用int Add(int left, int right);如果传的参数为double型,那么调用double Add(double left, double right)

编译器会根据参数类型,自动选择调用的函数

参数个数不同

void fun()
{cout << "f()" << endl;
}
void fun(int a)
{cout << "f(int a)" << endl;
}
int main()
{fun();fun(1);return 0;
}

运行结果:
在这里插入图片描述
主函数中,第一个调用的函数fun(),没有参数,第二个调用的函数fun(1)传了一个参数,属于参数不同的情况。

但是在无参调用时,出现了歧义,对于两个fun函数来说,都可以不传参。

参数类型顺序不同

void Text(int a, char b)
{cout << "Text(int a,char b)" << endl;
}
void Text(char b, int a)
{cout << "Text(char b, int a)" << endl;
}int main()
{Text(1, 'a');Text('a', 1);return 0;
}

运行结果:

在这里插入图片描述

编译器自己会根据传入的参数类型不同而选择相应的函数。

C++支持函数重载的原理

为什么C++支持函数重载,而C语言不支持函数重载呢?

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。

预处理是展开头文件/宏替换/条件编译/去掉注释

编译是检查语法,转成汇编代码

汇编是把汇编代码转成二进制机器码

在这里插入图片描述
实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们
可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标
文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。

如何处理这一问题?

链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就
会到b.o的符号表中找Add的地址,然后链接到一起。每个编译器都有自己的
函数名修饰规则。

Windows系统下的命名规则稍复杂,在Linux操作系统下会简单些,可参考文章–>Linux编译器-gcc/g++

在这里插入图片描述

这篇关于初谈C++:缺省参数函数重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)