【是C++,不是C艹】 省缺参数 | 函数重载 | 内联函数 下

简介: 省缺参数 | 函数重载 | 内联函数

正文


Part2:函数重载


1.一个引子


从自然语言开始吧,比如中文:

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

🌰比如:

以前有一个笑话,中国有两个体育项目大家根本不用看,也不用担心。

一个是乒乓球,一个是男足。

前者是“谁也赢不了!,后者是谁也赢不了!

🪄嘿,谁也赢不了!”这句话,我不用解释你也知道它的双重意思,“谁也赢不了!”这句话就被重载了。


2.概念


自然语言有重载,像C++这样的计算机语言中也有函数重载

C++允许在同一作用域中声明几个功能类似的同名函数。

只要满足下列一个条件就能满足函数重载:

①参数类型不同

②参数个数不同

③参数顺序不同


🌰例子:

#include<iostream>
using namespace std;
// ① 参数类型不同
int Add(int x, int y)
{
  cout << "int Add(int x, int y)" << endl;
  return x + y;
}
double Add(double x, double y)
{
  cout << "double Add(double x, double y)" << endl;
  return x + y;
}
int main()
{
  cout << Add(3, 5) << endl;
  cout << Add(3.1, 5.2) << endl;
  return 0;
}


👁️‍🗨️输出结果:


d8d5a393a77a2d0b58e35cde5bf96ab8_75e43b301f2243a580240de9ceb5e465.png

(这种类型适用了不同数据类型的加法)

// ② 参数个数不同
void f()
{
  cout << "f()" << endl;
}
void f(int a)
{
  cout << "f(int a)" << endl;
}
int main()
{
  f();
  f(10);
  return 0;
}


👁️‍🗨️输出结果:

40879abd97d2e5252a33b083d533d201_4aa8a3a137514e92b70c1f0491ee9796.png

// ③ 参数类型顺序不同
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;
}
int main()
{
  f(10, 'c');
  f('c', 10);
  return 0;
}

👁️‍🗨️输出结果:

c64a794dd38946cd55e5177a5611c5bc_d3e33298a60e43daad8ecdb66a1bd81b.png


3.不支持函数重载


以下情况不支持函数重载:

①函数返回值不同

②函数省缺值不同

③调用存在歧义


函数返回值不同:

#include <iostream>
using namespace std;
int func(int x) {
  ;
}
double func(int x) {
  ;
}
int main()
{
  func(3);  // 不知道这里是调用 int func 还是 double func
  return 0;
}


👁️‍🗨️结果:

42b31d96f1204cd9c989a372f2940ae3_d17ce48659874b6bb6b5c3b7dbae4a28.png

这个还好理解,在调用的时候区别不开返回类型


函数省缺值不同:

#include <iostream>
using namespace std;
void func(int a) 
{
  cout << "func(int a)" << endl;
}
void func(int a = 10) 
{
  cout << "func(int a)" << endl;
}
int main()
{
  func(1);
  return 0;
}


👁️‍🗨️结果:

8bd8a83a3b858542751474f47158e1e4_612106404d824a27b1874fa4060c55e6.png

调用存在歧义:

#include <iostream>
using namespace std;
void func() 
{
    cout << "func()" << endl;
}
void func(int a = 0) 
{
    cout << "func(int a)" << endl;
}
int main()
{
    func();   // 调用存在歧义
    func(1);  // 可以正常调用
    return 0;
}


👁️‍🗨️结果:

5cbba83175302380636d981778972d5a_ed638465b21a444e96a03d0e38ec2c5e.png


Part3:内联函数


1.概念


内联内联,单看这个名字的却没什么概念,这里就直接告诉你吧:

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开

没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

众所周知,普通的函数调用都是需要建立栈帧的,

存在这种情况:需要频繁调用的函数,并且函数本身代码量不多,那么就可以利用内联函数,加个 inline,展开后就没有函数调用建立栈帧的开销了。


🌰例子:

#include <iostream>
using namespace std;
inline int Add(int x, int y)
{
  return x + y;
}
int main()
{
  int ret = Add(3, 5);
  return 0;
}

 

转到反汇编,就不会看到call指令了


2.特性


我们来客观的分析一下内联函数的特性:

inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用;

缺陷:可能会使目标文件变大

优势:少了调用开销,提高程序运行效率


inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同;

一般建议:将函数规模较小、不是递归、频繁调用的函数采用inline修饰


🪄程序员不小心,还有编译器挡着嘛,如果你把太长的函数内联了,编译器受不了的~


它大概率会忽略内联请求。

inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。


总结:

本期继续带大家学习C++,知识点有:省缺参数 | 函数重载 | 内联函数,主要是针对函数的。

目录
相关文章
|
3天前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
17 3
|
2天前
|
算法 编译器 C++
C++多态与虚拟:函数重载(Function Overloading)
重载(Overloading)是C++中的一个特性,允许不同函数实体共享同一名称但通过参数差异来区分。例如,在类`CPoint`中,有两个成员函数`x()`,一个返回`float`,另一个是设置`float`值。通过函数重载,我们可以为不同数据类型(如`int`、`float`、`double`)定义同名函数`Add`,编译器会根据传入参数自动选择正确实现。不过,仅返回类型不同而参数相同的函数不能重载,这在编译时会导致错误。重载适用于成员和全局函数,而模板是另一种处理类型多样性的方式,将在后续讨论中介绍。
|
3天前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
7 2
|
4天前
|
C++
C++中的函数重载
C++的运算符重载允许改变运算符行为,使其能应用于自定义类型。重载函数可为类成员或全局函数,需匹配运算符原本的参数和返回类型。示例展示了如何重载`+`和`&lt;&lt;`运算符。此外,友元函数能访问类的私有成员,增加代码灵活性。继承是OOP的关键特性,如单一继承(类B直接继承类A)和多级继承(类D继承类C,类C继承类B)。多态通过虚函数实现,允许基类指针调用派生类的方法,如`Animal`的`makeSound()`在`Cat`和`Dog`中的不同实现。
4 0
|
8天前
|
编译器 C++
C++中的内联函数与const限定词的使用
C++中的内联函数与const限定词的使用
15 1
|
8天前
|
程序员 编译器 C++
C++中的函数重载(Function Overloading)
C++中的函数重载(Function Overloading)
9 2
|
18天前
|
编译器 C语言 C++
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr(下)
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr
21 0
|
18天前
|
存储 安全 编译器
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr(上)
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr
24 0
|
18天前
|
存储 安全 编译器
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(下)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
20 0
|
18天前
|
存储 编译器 C语言
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用(中)
从C语言到C++②(第一章_C++入门_中篇)缺省参数+函数重载+引用
23 0