【是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++,知识点有:省缺参数 | 函数重载 | 内联函数,主要是针对函数的。

目录
相关文章
|
26天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
1月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
79 2
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
26天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
21 0
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
2月前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
41 0
|
2月前
|
C语言 C++
C++(三)内联函数
本文介绍了C++中的内联函数概念及其与宏函数的区别。通过对比宏函数和普通函数,展示了内联函数在提高程序执行效率方面的优势。同时,详细解释了如何在C++中声明内联函数以及其适用场景,并给出了示例代码。内联函数能够减少函数调用开销,但在使用时需谨慎评估其对代码体积的影响。
|
9天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
36 4