首页 > 编程语言 >C++缺省参数与函数重载

C++缺省参数与函数重载

时间:2024-03-25 23:01:48浏览次数:36  
标签:函数 int 缺省 C++ 缺省值 参数 重载 cout

1.缺省参数

1.1定义

即函数声明或定义时为函数指定一个缺省值,如果调用函数时传入参数,则变量的值为实参的值,如果调用时未传入参数,则变量的值为缺省值。

//其中a = 0即为定义的缺省值
void Fun_test(int a = 0)
{
	cout << "a= " << a << endl;
}

int main()
{
    //传入参数,a为实参值,输出a = 1
	Fun_test(1);
    //未传入参数,a为缺省值,输出a = 0
	Fun_test();
	return 0;
}

1.2缺省参数分类

即函数的参数传入了缺省值,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。

1.2.1全缺省参数

即函数的所有参数传入了缺省值,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。

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

int main()
{
	//使用缺省值,必须从右往左连续使用,即本利按c b a顺序缺省
    //输出1 2 3,即未使用缺省值
	Func_test(1, 2, 3);
    //输出1 2 30,c变量使用了缺省值
	Func_test(1, 2);
    //输出1 20 30,b c变量使用了缺省值
	Func_test(1);
    //输出10 20 30,a b c变量均使用了缺省值
	Func_test();
}

1.2.2半确实参数(部分缺省)

即函数的部分参数传入了缺省值,且缺省值必须从右往左连续缺省,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。

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

int main()
{
	//使用缺省值,必须从右往左连续使用,即本利按c b a顺序缺省
    //输出1 2 3,即未使用缺省值
	Func_test(1, 2, 3);
    //输出1 2 30,c变量使用了缺省值
	Func_test(1, 2);
    //输出1 20 30,b c变量使用了缺省值
	Func_test(1);
}

1.3总结

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给

  2. 缺省参数不能在函数声明和定义中同时出现,当在main函数中调用Func时会报错。(因为这种情况下,如果两个缺省值给不同值,编译器不知道该调用哪个),同时出现时建议在声明时给缺省参数,定义时不给。

//a.h文件中的函数声明
void Func(int a = 20);
  
// a.cpp文件中的函数定义
void Func(int a = 20)
{}


//下面这种情况下,编译器就分不清到底该使用哪个缺省值,所以不支持声明与定义都用缺省值
//a.h1文件中的函数声明
void Func(int a = 10);
  
// a.cpp1文件中的函数定义
void Func(int a = 20)
{}

//同时出现时建议在声明时给缺省参数,定义时不给。

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

2.函数的重载

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

//1.参数类型不同,int 与 int
int Add(int left, int right)
{
	cout << "int(left + right)" << endl;
	return left + right;
}
//double 与 double
double Add(double left, double right)
{
	cout << "double(left + right) " << endl;
	return left + right;
}

//2.参数的个数不同,无参数
void fun()
{
	cout << "f" << endl;
}
//一个参数
void fun(int a)
{
	cout << "f(a)" << endl;
}
//两个参数
void fun(int a, int b)
{
	cout << "f(a,b)" << endl;
}

//3.参数的类型顺序不同,int 与 char
void fun(int a, char b)
{
	cout << "fun(int a, char b)" << endl;
}
//char 与 int
void fun(char a, int b)
{
	cout << "fun(char a, int b)" << endl;
}

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

C++在编译过程中,按照一定规则将函数名保留,还会保留参数的类型与顺序。

例如:

//可以简单理解为下面两种情况
// _Z3Addii-> _Z3:公共部分 Add:函数名 ii:参数类型 int int
int Add(int left, int right)
{
	cout << "int(left + right)" << endl;
	return left + right;
}
// _Z3Adddd-> _Z3:公共部分 Add:函数名 dd:参数类型 double double
double Add(double left, double right)
{
	cout << "double(left + right) " << endl;
	return left + right;
}

当然这只是方便理解,具体的规则根据编译器不同规则也不同,真正规则可能复杂的多,但是可以这样理解。

2.2总结

        1.函数重载有三种情况,参数类型不同参数个数不同参数类型顺序不同。

        2.返回值不同时不能构成函数重载。原因如下:

int Add(int left, int right)
{
	cout << "int(left + right)" << endl;
	return left + right;
}
double Add(int left, int right)
{
	cout << "double(left + right) " << endl;
	return left + right;
}
int main()
{
    //因为如果只有返回值不同,调用函数时,编译器无法区分调用的是哪个Add函数
    Add(1,2);
    Add(2,3);
}

标签:函数,int,缺省,C++,缺省值,参数,重载,cout
From: https://blog.csdn.net/weixin_75171449/article/details/136991685

相关文章

  • 用Dev C++实现NOKIA经典游戏贪吃蛇
    前期准备头文件:#include<bits/stdc++.h>#include<stdio.h>#include<conio.h>#include<windows.h>控制界面配置:voidcolor(intx){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);}//设置不同颜色voidHide(){ HANDLEhOut; CONSOLE_CUR......
  • 学会在 C++ 中使用变量:从定义到实践
    C++变量变量是用于存储数据值的容器。在C++中,有不同类型的变量(使用不同的关键字定义),例如:int-存储整数(没有小数点),例如123或-123double-存储浮点数,带有小数点,例如19.99或-19.99char-存储单个字符,例如'a'或'B'。字符值用单引号括起来string-存储文本,例如......
  • C++调用C# (使用C++/CLI)
    简介C++/CLI简介见上文 C#调用C++(使用C++/CLI)-咸鱼翻身?-博客园(cnblogs.com)新建解决方案->CPlusCSharpSolution新建C#类库->CSharpNative新建类NativeCalculate1publicclassNativeCalculate2{3publicintAdd(inta,intb)4{......
  • C#调用C++ (使用C++/CLI)
    简介C++/CLI(C++CommonLanguageInfrastructure)是一种允许在.NET平台上创建托管代码(managedcode)和非托管代码(unmanagedcode)之间互操作的语言。其原理可以概括如下:编译器支持:C++/CLI编译器能够编译同时包含托管和非托管代码的源文件。这使得在同一个项目中可以混合使用......
  • 蓝桥杯n皇后问题C++
    用到了dfs算法#include<iostream>usingnamespacestd;intn;inta[10][10]={0};intsum=0;voidprin(inta[][10]){for(inti=0;i<n;i++){for(intj=0;j<n;j++){cout<<a[i][j]<......
  • C++动态内存管理
    目录C/C++内存分配C++内存管理C++内存管理介绍C++内存管理使用C++内存管理基本语法operatornew和operatordelete函数定位new表达式(placement-new)基本语法使用场景malloc/free和new/delete相同点不同点C/C++内存分配在C语言动态内存管理章节已经了解到内......
  • Java的方法、重载、递归、内存
    一、方法什么是方法方法:一堆代码的集合,一般完成了某个特定的功能,当我们再次使用这个方法的时候,就等于使用了这些代码。方法目的:代码复用,提高程序灵活度,易维护,易扩展。方法的声明修饰符列表  返回值类型  方法名 (参数列表){ 方法体 }注意事项修饰符列表 ......
  • C++中用户自定义数据类型
    在C++中,用户自定义数据类型通常指的是通过struct、class、enum和typedef关键字定义的类型。这些自定义类型可以包含各种成员,包括基本数据类型、其他自定义类型、成员函数(对于class)、访问修饰符等。下面是这些自定义数据类型可以包含的组件的概述:结构体(struct)结构体是一种......
  • C++学习
    学习主线算法基础:https://www.acwing.com/activity/content/11/理解算法原理,完成模板题,熟练使用模版课外练习:针对特定主题,可以进行拓展练习爱思创题库:https://aisichuang.net/main/questionBank/questionBankhttps://leetcode.cn/leetbook/https://ac.nowcoder.co......
  • C++第五十六篇——VC获取显示器状态(捕获熄屏/亮屏)
    参考链接:https://blog.csdn.net/rocklee/article/details/76636253此篇文章实现C++可以获取屏幕亮灭的消息,程序在后台运行,不会有控制台窗口显示。第一步:新建一个控制台程序 第二步:编写屏幕亮灭的代码ScreenTest.cpp#include<windows.h>#include<iostream>usingname......