【C++】入门 --- 缺省参数&函数重载

这篇具有很好参考价值的文章主要介绍了【C++】入门 --- 缺省参数&函数重载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux


【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

🥮一、缺省参数

🍕1、基本概念

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

🌰举个栗子👇

//缺省参数
void Func(int a = 1)
{
	cout << a << endl;
}

int main()
{
	Func(10);
	Func();

	return 0;
}

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

🚨注意:缺省值(函数形参的默认值)不能同时在函数声明和函数定义中给出(缺省参数不能在函数声明和定义中同时出现);

🚨注意:缺省值必须是常量或者全局变量。

🍕2、缺省参数的分类

🚩全缺省参数

🔴全缺省参数:每个形参都指定缺省值

🌰举个栗子👇

//全缺省参数
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();
	//显示传参,从左往右显示传参
	Func(1);
	Func(1,2);
	Func(1, 2, 3);

	return 0;
}

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

🚩半缺省参数

🔴半缺省参数:为部分形参指定缺省值

🌰举个栗子👇

//半缺省参数
void Func(int a, int b = 10, int c = 20)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}

int main()
{
	Func(1);
	Func(1,2);
	Func(1, 2, 3);

	return 0;
}

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

🚨注意:半缺省参数必须从右往左依次来给出,不能间隔着给

下面这种情形是不允许的👇

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

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

🚩缺省参数实用案例

假如要实现一个栈的结构,我们不知道要入栈插入多少个数据,所以不知道初始化开辟多少内存空间合适,给多了浪费,给少了不够用,这时我们就可以使用缺省参数

🌰请看演示代码👇

Stack.h

#include<stdlib.h>
namespace N1
{
	typedef struct Stack
	{
		int* a;
		int top;  
		int capacity;
	}ST;

	//不允许声明和定义同时给缺省参数
	//声明给,定义不给
	void StackInit(ST* ps, int N = 4)
	{
		ps->a = (int*)malloc(sizeof(int) * N);
		ps->top = 0;
		ps->capacity = 0;
	}

Test.cpp

#include "Stack.h"

int main()
{
	N1::ST st1;
	StackInit(&st1, 10);//知道10个
	for (size_t i = 0; i < 10; i++)
	{
		StackPush(&st1, i);
	}

	N1::ST st2;
	StackInit(&st2, 100);//知道100个
	for (size_t i = 0; i < 100; i++)
	{
		StackPush(&st2, i);
	}

	//不知道可能会插入多少个
	N1::ST st3;
	StackInit(&st3);

	return 0;
}

🥮二、函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个
是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

🍕1、函数重载概念

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

重载函数之间是通过函数的 形参个数 或 形参类型 或 形参类型顺序 来区分的(只有这三个区分标准),重载函数之间的区分在于形参的差异。

1️⃣参数类型不同

// 1、参数类型不同
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;

2️⃣参数个数不同

// 2、参数个数不同
void func1()
{
	cout << "func1()" << endl;
}
void func1(int a)
{
	cout << "func1(int a)" << endl;
}

3️⃣参数类型顺序不同

// 3、参数类型顺序不同
void func2(int a, char b)
{
	cout << "func2(int a,char b)" << endl;
}
void func2(char b, int a)
{
	cout << "func2(char b, int a)" << endl;
}
int main()
{
	cout << Add(10, 20) << endl;
	cout << Add(10.1, 20.2) << endl;

	cout << endl;

	func1();
	func1(10);

	cout << endl;

	func2(10, 'a');
	func2('a', 10);

	return 0;
}

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

🚨注意以下两种情况不构成函数重载:

namespace M1
{
	void func(int x)
	{};
}

namespace M2
{
	void func(int x)
	{};
}

不在同一作用域中(函数重载必须在同一作用域中)☝️

namespace M1
{
	void func(int x)
	{};
}

namespace M1
{
	void func(int x)
	{};
}

自动合并了☝️

namespace M1
{
	void func(int x)
	{};
}

namespace M1
{
	void func(double x)
	{};
}

构成函数重载✅

函数重载和缺省参数没有关系:

void func(int a)
{
	cout << "void func(int a)" << endl;
}

void func(int a, int b = 1)
{
	cout << "void func(int a, int b)" << endl;
}

int main()
{
	func(1, 2);

	//调用存在歧义,不知道调用哪个
	//func(1);

	return 0;
}

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

🥮三、C++支持函数重载的底层原理–函数名修饰

形成可执行文件要四个阶段:预处➡️编译➡️汇编➡️链接
【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux
【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux
【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

void func(int i, double d)
{
	cout << "void func(int i, double d)" << endl;
}

void func(double d, int i)
{
	cout << "void func(double d, int i)" << endl;
}

int main()
{
	func(1, 1.1);  // call func()

	func(1.1, 1);  // call func()

	return 0;
}

对这段代码编译生成反汇编:
【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux
call指令是通过函数的符号表来定位函数的地址的
【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux
但是在C语言中,函数符号表中函数的命名规则就是原模原样地照搬源文件中的函数标识名。

C++符号表中的函数名修饰:
在符号表中,各个函数的命名都遵循一定的函数名修饰规则:
在g++编译环境(支持C++的编译器)中,符号表中的函数名经过修饰后变成【_Z+函数名长度+函数名+类型首字母】(这点和C语言的符号表中函数的命名规则完全不同)

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux

C++(g++编译环境)这种名字修饰规则使得标识名相同,形参不同的函数在符号表中得到了区分,因此编译器在编译和链接的过程中就能根据函数调用语句具体的实参类型明确地找到相应重载函数的函数体的地址并访问函数体中的指令,实现了重载函数的调用。
C语言中不存在这种名词修饰规则,因此在符号表中标识名相同的函数的符号表命名也是相同的,所以编译器在编译和链接的过程中无法对同标识名函数进行区分,所以无法实现函数重载。

😍这期内容有一点点难理解,希望烙铁们能理解消化,有所收获哦!

总结🥰
以上就是 【C++】缺省参数&函数重载 的全部内容啦🥳🥳🥳🥳
本文章所在【C++初阶】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
前途很远,也很暗,但是不要怕,不怕的人面前才有路。💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

【C++】入门 --- 缺省参数&函数重载,C++ 初阶,c++,函数重载,开发语言,linux文章来源地址https://www.toymoban.com/news/detail-607454.html

到了这里,关于【C++】入门 --- 缺省参数&函数重载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入&输出、缺省参数、函数重载

    目录 1. C++ 2. 命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C++输入输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C++支持函数重载的原理——名字修饰(name Mingling) 5.3 extern \\\"C\\\" ❀❀❀ 没有坚持的努力,本质上并没有多

    2024年02月15日
    浏览(55)
  • 【C++】入门 --- 缺省参数&函数重载

    缺省参数是声明或定义函数时 为函数的参数指定一个缺省值 。 在调用该函数时, 如果没有指定实参则采用该形参的缺省值 ,否则使用指定的实参。 🌰举个栗子👇 🚨 注意: 缺省值(函数形参的默认值)不能同时在函数声明和函数定义中给出(缺省参数不能在函数声明和定义

    2024年02月15日
    浏览(34)
  • C++入门:函数缺省参数与函数重载

    目录 1.函数缺省参数 1.1 缺省参数概念 1.2 缺省参数分类 2.函数重载 2.1 函数重载概念 2.2 C++支持函数重载的原理 缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参,有点备胎的意

    2024年02月12日
    浏览(32)
  • 【C++初阶】关键字&命名空间&缺省函数&函数重载入门必看!!!超详解!!!

     ========================================================================= 主页点击直达: 个人主页 我的小仓库:代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 计算机

    2024年02月07日
    浏览(45)
  • C++入门 上(命名空间 缺省参数 函数重载)

    在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace的出现就是针对这种问题的。 定义命名空间

    2024年02月19日
    浏览(45)
  • C++之入门之缺省参数&&函数重载&&引用

    重新拿起曾经尚未填的C++的坑,从现在我会继续更新C++的相关内容,希望各位能够支持 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参 (1)全缺省参数 (2)半缺省参数 (1)半

    2023年04月15日
    浏览(39)
  • 【C++入门 三】学习C++缺省参数 | 函数重载 | 引用

    缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。 ①全缺省参数 ②半缺省参数 注意: 1. 半缺省参数必须从右往左依次来给出,不能间隔着给 2. 缺省参数不能在函数声明和定义中

    2024年02月06日
    浏览(42)
  • 【C++学习】C++入门 | 缺省参数 | 函数重载 | 探究C++为什么能够支持函数重载

    上一篇文章我介绍了C++该怎么学,什么是命名空间,以及C++的输入输出, 这里是传送门:http://t.csdn.cn/Oi6V8 这篇文章我们继续来学习C++的基础知识。 目录 写在前面: 1. 缺省参数 2. 函数重载 3. C++是如何支持函数重载的 写在最后: 在学习C语言的时候,如果一个函数存在参数

    2024年02月13日
    浏览(47)
  • 计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)

    三点睡六点起,阎王夸我好身体 不到三点我不睡,太平间里抢C位 目录: 前言: 本片博客是以学习过C语言之后进入C++学习为前提,讲解C++入门级知识,为C++之后的学习做铺垫 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀

    2024年04月11日
    浏览(129)
  • 【C++】缺省参数与函数重载

    👀樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章博主将带你学习 缺省参数 与 函数重载 ,一些需要注意的点博主都会特别标注以便大家学习。 欢

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包