【C++入门到精通】C++入门—缺省参数、函数重载

简介: 【C++入门到精通】C++入门—缺省参数、函数重载

前言


       前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点,也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++的知识点——缺省参数、函数重载。下面话不多说坐稳扶好咱们要开车了。


一、缺省参数


1.缺省参数的概念


       所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。 缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数,即: 带缺省值的参数必须放在参数表的最后面。


例如:


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


2.缺省参数分类


       ⭕全缺省参数


       也就是全部缺省的函数,都有初始化的值,例如:


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


       ⭕半缺省参数


       也就是部分缺省的函数,部分有初始化的值,例如:


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

  需要注意的有四点:


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


🔴缺省参数不能在函数声明和定义中同时出现


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


🔴C语言不支持(编译器不支持)


//a.h
void Func(int a = 10);
// a.cpp
void Func(int a = 20)
{...}
// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。


二、函数重载


1.函数重载的概念


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

不同的问题。


2.函数重载类型


       🔴参数类型不同


#include<iostream>
using namespace std;
// 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、参数个数不同
void f()
{
    cout << "f()" << endl;
}
void f(int a)
{
    cout << "f(int a)" << endl;
}


       🔴参数类型顺序不同


void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}


C++支持函数重载的原理--名字修饰(name Mangling)


       想必你的内心肯定有这样的疑问为什么C++支持函数重载,而C语言不支持函数重载呢?


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


ad9d12feef674bf4ba3695ccda2b74b5_format,png.png


bb2392a7e1c60b2ca1500fc7ddb1c3a7_404a7a85fcf74c838a301caf671a84fa.png

       通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。


参数匹配


       编译器根据当前范围内的函数声明与函数调用中提供的参数的最佳匹配,来选择要调用的重载函数。 如果找到合适的函数,则调用该函数。 (步骤如下)


🔴找到完全匹配项。


🔴已执行不重要的转换。


🔴已执行整型提升。


🔴已存在到所需自变量类型的标准转换。


🔴已存在到所需参数类型的用户定义转换(转换运算符或构造函数)。


🔴已找到省略号所表示的自变量。


       编译器为每个自变量创建一组候选函数。 候选函数是这样一种函数,其中的实际自变量可以转换为形式自变量的类型。为每个自变量生成一组“最佳匹配函数”,并且所选函数是所有集的交集。 如果交集包含多个函数,则重载是不明确的并会生成错误。 对于至少一个参数而言,最终选择的函数始终比组中的所有其他函数更匹配。 如果没有明显的优胜者,函数调用会生成编译器错误。


目录
相关文章
|
29天前
|
安全 编译器 程序员
【C++初阶】C++简单入门
【C++初阶】C++简单入门
|
29天前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
16 4
C++函数重载
|
8天前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
29天前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
1月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
24 5
|
1月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
47 4
|
27天前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组
|
27天前
|
存储 编译器 程序员
C++从遗忘到入门
本文主要面向的是曾经学过、了解过C++的同学,旨在帮助这些同学唤醒C++的记忆,提升下自身的技术储备。如果之前完全没接触过C++,也可以整体了解下这门语言。
|
8天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
8天前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。