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

这篇具有很好参考价值的文章主要介绍了【是C++,不是C艹】 省缺参数 | 函数重载 | 内联函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💞💞欢迎来到 Claffic 的博客 💞💞

  👉 专栏:《是C++,不是C艹》👈

前言: 

上期,我带大家给C++打了招呼,捎带着认识了命名空间和输入输出,那么这期带大家继续学习C++,让我们开始吧!

注:

你最好是学完了C语言,并学过一些初阶的数据结构。


(没有目录) ヽ( ̄ω ̄( ̄ω ̄〃)ゝ

Part1:缺省参数

1.一个引子

我把这段代码抛给你:

#include<iostream>
using namespace std;
void Func(int a)
{
	cout << a << endl;
}
int main()
{
	Func(3);
	return 0;
}

 挺平平无奇的,是吧?

👁️‍🗨️输出结果:3

那如果我手贱,调用时没传参数呢?

#include<iostream>
using namespace std;
void Func(int a)
{
	cout << a << endl;
}
int main()
{
	Func(); // 这里没传参数
	return 0;
}

活生生的报错: 

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

报错原因:没有传递参数 

但是,但是,

C++可以这样玩:

#include<iostream>
using namespace std;
void Func(int a = 114514) // 这里变了哈
{
	cout << a << endl;
}
int main()
{
	Func(); // 同样没有传参
	return 0;
}

 👁️‍🗨️输出结果:114514

这就是“缺省参数”,接下来就让我带你学它!!! 

2.概念

准确地说,什么是缺省参数呢?

缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值
在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

简单说:你传了就用你的,不传也没关系,我用自己的。 

在引入当中的例子就可以很好地解读缺省参数的基本概念:

#include<iostream>
using namespace std;
void Func(int a = 114514) // 指定缺省值
{
	cout << a << endl;
}
int main()
{
	Func(3); // 指定实参,使用实参
	Func();  // 不指定实参,使用缺省值
	return 0;
}

👁️‍🗨️输出结果:3

                       114514 

3.分类

缺省参数分两类:全缺省参数半缺省参数

• 全缺省参数:函数的参数指定了省缺值;

• 半缺省参数:函数的参数部分指定了省缺值。

接下来分别讲解:

全缺省参数:

🚨注意:一定是全部的参数都要给缺省值

代码演示: 

#include<iostream>
using namespace std;
void Func(int a = 1,int b = 2,int c = 3 ) // 都给了哈
{
	cout << a << ' ';
	cout << b << ' ';
	cout << c << endl;

}
int main()
{
	Func();           // 不传参
	Func(10);         // 传第一个参
	Func(10, 20);     // 传第一,第二个参
	Func(10, 20, 30); // 全传参,不采用缺省值

	return 0;
}

👁️‍🗨️输出结果:

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

🪄解释:

第一次调用:没有传参,都使用缺省参数;

第二次调用:传递了10,这个给了a,其余默认;

第三次调用:传递了10,20,依次给了a,b,c默认;

第四次调用:全传递,不采用缺省值。

好奇心大发,我值传给c行不行?

Func(, , 30);     // 试图传给c

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

🈲看这爆红你就知道行不行了。

为甚?

参数默认是从左往右传递的啊,语法就这样规定的,不行你就给本贾尼打个电话👻

半缺省参数:

半缺省参数可不能理解成一半... ...

它指的是部分缺省。

🌰例子:

void Func(int a, int b = 2, int c = 3) // 给b和c默认值
{
	cout << a << ' ';
	cout << b << ' ';
	cout << c << endl;
}
void Func(int a, int b, int c = 3) // 给c默认值
{
	cout << a << ' ';
	cout << b << ' ';
	cout << c << endl;
}

“我故意保留了一部分缺省,这样才能让你知道这是半缺省!!!”😝

那我这样给缺省行不行?

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

🈲你说行不行?爆红是爆给谁看的?

🚨记住:

半缺省参数必须 从右往左依次 来给出,不能间隔着给。

4.注意

这里就总结一下在使用缺省参数中要注意的点: 

• 半缺省参数必须 从右往左依次 来给出,不能间隔着给;
• 缺省参数不能函数声明和定义同时出现;
• 缺省值必须是常量或者全局变量
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;
}

👁️‍🗨️输出结果:

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

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

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

	return 0;
}

👁️‍🗨️输出结果:

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

// ③ 参数类型顺序不同
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;
}

 👁️‍🗨️输出结果:

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

3.不支持函数重载

以下情况不支持函数重载:
①函数返回值不同
②函数省缺值不同
③调用存在歧义

函数返回值不同: 

#include <iostream>
using namespace std;

int func(int x) {
	;
}
double func(int x) {
	;
}
int main()
{
	func(3);  // 不知道这里是调用 int func 还是 double func

	return 0;
}

👁️‍🗨️结果:

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

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

函数省缺值不同: 

#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;
}

👁️‍🗨️结果:

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

调用存在歧义:

#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;
}

👁️‍🗨️结果: 

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

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

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗文章来源地址https://www.toymoban.com/news/detail-427037.html

到了这里,关于【是C++,不是C艹】 省缺参数 | 函数重载 | 内联函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【c++速通】入门级攻略:什么是内联函数?函数重载又是什么?

    🎥 屿小夏 : 个人主页 🔥个人专栏 : C++入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 在上一篇文章中我们了解到了命名空间和缺省函数的存在,以及C++为什么要引入它们。本章将继续C++在C语言上扩展出的语法,以帮助大家快速入门。函数竟然还有内联的形式?函数重载,重

    2024年02月06日
    浏览(38)
  • 【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

    目录 前言 函数重载 概念 重载函数的条件 C++支持重载函数的原理--名字修饰 引用 概念 特性 常引用(const引用) 使用场景 传值,传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto(C++11) auto简介 auto的使用规则 指针空值nullptr(C++11) C++98中的指针空值 结语

    2024年04月15日
    浏览(49)
  • 【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

    在C语言中,同名函数是不能出现在同一作用域的,但是在C++中却可以,但是要满足函数重载的规则。 那什么是函数重载呢?它的规则是什么呢? 函数重载 :是函数的一种特殊情况,C++允许在 同一作用域 中声明几个功能类似的 同名函数 ,这些同名函数的 形参列表(参数个数

    2024年04月26日
    浏览(55)
  • 【C++学习】C++入门 | 缺省参数 | 函数重载 | 探究C++为什么能够支持函数重载

    上一篇文章我介绍了C++该怎么学,什么是命名空间,以及C++的输入输出, 这里是传送门:http://t.csdn.cn/Oi6V8 这篇文章我们继续来学习C++的基础知识。 目录 写在前面: 1. 缺省参数 2. 函数重载 3. C++是如何支持函数重载的 写在最后: 在学习C语言的时候,如果一个函数存在参数

    2024年02月13日
    浏览(48)
  • C++入门:函数缺省参数与函数重载

    目录 1.函数缺省参数 1.1 缺省参数概念 1.2 缺省参数分类 2.函数重载 2.1 函数重载概念 2.2 C++支持函数重载的原理 缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参,有点备胎的意

    2024年02月12日
    浏览(33)
  • 【C++】缺省参数与函数重载

    👀樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章博主将带你学习 缺省参数 与 函数重载 ,一些需要注意的点博主都会特别标注以便大家学习。 欢

    2024年02月08日
    浏览(35)
  • 【C++】入门 --- 缺省参数&函数重载

    缺省参数是声明或定义函数时 为函数的参数指定一个缺省值 。 在调用该函数时, 如果没有指定实参则采用该形参的缺省值 ,否则使用指定的实参。 🌰举个栗子👇 🚨 注意: 缺省值(函数形参的默认值)不能同时在函数声明和函数定义中给出(缺省参数不能在函数声明和定义

    2024年02月15日
    浏览(36)
  • 【C++初阶】C++入门——缺省参数、函数重载

     缺省参数是 声明或定义函数时为函数的参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。  上面代码在 fun 函数的形参部分给了缺省值10,这意味着在调用 fun 函数的时候可以传参,也可以不传参,如果传参了那形参

    2024年02月11日
    浏览(37)
  • 【初识C++】(缺省参数和函数重载)

    缺省参数是在函数的声明中给定参数一个指定的值。 如果传参没有给定参数,那就按照声明中默认的缺省值,如果给定了参数,那就按照给定的参数值。 比如: 对于Func函数如果没有给定参数,那就按照默认的缺省值来赋值。如果给定了参数,那就按照给定的参数进行赋值。

    2024年02月01日
    浏览(37)
  • 【C++初阶(二)】缺省参数&函数重载

    目录 前言 1. 缺省参数  1.1 什么是缺省参数  1.2 缺省参数的分类      1.2.1 全缺省参数  1.2.2 半缺省参数 2. 函数重载  2.1 什么是函数重载  2.2 缺省参数与函数重载  2.3 函数重载的使用  3. C++支持函数重载的原因  总结         在学习C语言时我们就会发现,C语言中存在的

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包