【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++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。


参数匹配


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


🔴找到完全匹配项。


🔴已执行不重要的转换。


🔴已执行整型提升。


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


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


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


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


目录
相关文章
|
3月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
52 2
C++入门12——详解多态1
|
3月前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
30 3
|
3月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
89 1
|
3月前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
40 0
|
3月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
32 0
|
3月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
39 0
|
3月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
3月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
60 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
110 5