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

目录
相关文章
|
2月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
64 4
|
3月前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
30 3
|
3月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
99 2
|
3月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
43 0
|
3月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
3月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
32 0
|
4月前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
53 0
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2