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


参数匹配


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


🔴找到完全匹配项。


🔴已执行不重要的转换。


🔴已执行整型提升。


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


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


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


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


目录
相关文章
|
1天前
|
编译器 C语言 C++
C++入门基础-2
C++入门基础
10 3
|
1天前
|
C语言 C++
C++入门基础-1
C++入门基础
14 1
|
2天前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
27 1
|
3天前
|
存储 安全 编译器
【C++从练气到飞升】03---C++入门(三)
【C++从练气到飞升】03---C++入门(三)
|
3天前
|
存储 自然语言处理 编译器
【C++从练气到飞升】02---C++入门(二)
【C++从练气到飞升】02---C++入门(二)
|
3天前
|
Unix 编译器 C语言
【C++从练气到飞升】01---C++入门(一)
【C++从练气到飞升】01---C++入门(一)
|
3天前
|
安全 编译器 程序员
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
12 0
|
3天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
14 0
|
5天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
13 1
|
2天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1