【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指令也会按照修饰后的函数名称进行寻址。

相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
23天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
23天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
19 0
|
1月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
1月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
24 0
|
1月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
1月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4