【C++精华铺】2.C++入门 缺省参数、函数重载

简介: 含有缺省参数的函数在声明的时候要注意声明的时候定义和声明如果是分开的话缺省参数必须写在声明里。

目录

1. 缺省参数(默认实参)

1.1 全缺省

1.2 半缺省

1.3 含有缺省参数的函数的声明和定义

2. 函数重载

2.1  函数重载的判定

2.2 函数重载的原理——函数名修饰规则


1. 缺省参数(默认实参)

       有些函数在定义的时候,我们会给形参列表赋予一个初始值,这个初始值我们称之为缺省参数或者默认实参。而我们在调用含有缺省参数的函数时我们可以省略该实参也可以不省略,如果省略就会默认将默认实参作为自己的字面值。(缺省值必须是常量或者全局变量)

#include<iostream>
using namespace std;
void print(int a = 0,int b = 1)
{
  cout << a << ' ' << b << endl;
}
int main()
{
  print();
  return 0;
}

image.gif

输出结果:

0 1

而由上我们又引出了全缺省和半缺省的概念如下。

1.1 全缺省

       全缺省顾名思义就是给形参列表中的所有形参都给一个默认实参,而我们在调用的时候就可以省略实参。但是我们在省略的时候只可以从右往左依次省略避免给编译器造成歧义导致出错。

void print(int a = 1, int b = 1, int c = 1)
{
  cout << a << ' ' << b << ' ' << c << endl;
}
int main()
{
  print(0, 0, 0);
  print(0, 0);
  print(0);
  print();
  return 0;
}

image.gif

1.2 半缺省

       半缺省其实就是部分缺省,给部分参数赋予默认实参,但在缺省的时候要遵从一个规定便是:任意一个缺省参数的右边所有形参都必须具有默认参数。

void print(int a = 1, int b = 1, int c = 1);
void print(int a, int b = 1, int c = 1);
void print(int a, int b, int c = 1);

image.gif

1.3 含有缺省参数的函数的声明和定义

       含有缺省参数的函数在声明的时候要注意声明的时候定义和声明如果是分开的话缺省参数必须写在声明里。

void print(int a = 1, int b = 1, int c = 1);
void print(int a, int b, int c){}

image.gif

2. 函数重载

2.1  函数重载的判定

       函数重载是C++中的一种特殊语法,即允许在同一作用域中声明几个功能类似的同名函数,这些函数的形参列表(参数个数、参数类型、类型顺序)不同,以此来处理实现功能类似但是类型不同的问题。(但需要注意函数的返回类型不作为函数重载的判定条件)

int add(int a,int b)
{
  return a + b;
}
double add(double a, int b)
{
  return a + b;
}
double add(int a, double b)
{
  return a + b;
}

image.gif

2.2 函数重载的原理——函数名修饰规则

       在我们程序的链接阶段,链接器会对函数进行寻址,但是重载的函数函数名都相同,链接器无法知道调用的是哪个函数,所以编译器会对重载的函数进行函数名修饰,而不同编译器的函数名修饰规则都不相同,windows下vs的函数名修饰规则较为复杂且不容易理解,而Linux下的函数名修饰规则(_Z+函数名长度+函数名+形参类型首字母)相对简单易懂,所以我会以Linux为例来给大家讲解。

image.gif编辑

        仔细对比上图我们就可以看到,在Linux下gcc对重载的函数进行了函数名修饰,将函数参数的类型信息添加到了修改后的名字中,call指令也会按照修饰后的函数名称进行寻址。

相关文章
|
5天前
|
编译器 C语言 C++
【C++】学习笔记——C++入门_2
【C++】学习笔记——C++入门_2
18 6
|
5天前
|
安全 编译器 C语言
【C++】学习笔记——C++入门_3
【C++】学习笔记——C++入门_3
20 4
|
5天前
|
程序员 编译器 C语言
【C++】学习笔记——C++入门_1
【C++】学习笔记——C++入门_1
16 4
|
5天前
|
安全 编译器 程序员
【C++初阶】--- C++入门(上)
【C++初阶】--- C++入门(上)
11 1
|
5天前
|
存储 安全 编译器
【C++初阶】--- C++入门(下)
【C++初阶】--- C++入门(下)
7 0
|
5天前
|
存储 编译器 Linux
【C++初阶】--- C++入门(中)
【C++初阶】--- C++入门(中)
10 0
|
6天前
|
存储 安全 编译器
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
10 0
|
2天前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。
|
4天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
7 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
2天前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。