IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++学习】——(八)函数 -> 正文阅读

[C++知识库]【C++学习】——(八)函数

【C++学习】——(八)函数

基础

函数:封装了一段代码,可以在一次执行过程中被反复调用,包含函数头和函数体;

函数头

  • 函数名称(标识符),用于后续的调用;
  • 形式参数,代表函数的输入参数;
  • 返回类型,函数执行完成后返回结果的类型;

函数体:一个语句块(block),包含具体的计算逻辑;

函数的声明与定义

  • 函数声明只包含函数头,不包含函数体,通常在头文件中;
  • 函数声明可以出现多次,定义通常出现一次(也有例外);

函数调用

  • 需要提供函数名与实际参数;
  • 实际参数拷贝初始化给形式参数;
  • 返回值会拷贝给函数的调用者;
  • 栈帧结构(可自行了解下);

参数

  • 对于非模板函数来说,其每个形参都有确定的类型,但形参可以没有名称;

  • 实参到形参的拷贝顺序是不确定的;

  • 函数的形参的传递一般分为:传值、传址、传引用

  • 变长参数的定义:

    1、使用initializer_list传递:

    #include <initializer_list>
    void fun(std::initializer_list<int> a){}
    
    int main
    {
    	fun({1, 2, 3, 4})
    }
    

    注意:该方法只能传递类型相同的变长参数;

    2、可变长度模板参数

    3、使用省略号表示形式参数(一般不使用)

  • 函数的缺省实参注意点:

    1、如果某个形参具有缺省参数,那么它右侧的形参都必须具有缺省实参;

    void fun(int x=1, int y=2){}	// 这里y必须给定缺省值
    

    2、具有缺省实参的函数调用时,传入实参按照从左到右的顺序进行匹配;

    3、在一个翻译单元中,每个形参的缺省实参只能定义一次;

    4、缺省实参为对象时,实参的缺省值会随对象值的变化而变化;

  • main函数的版本

    1、无形参版本(一般使用)

    2、带形参版本

    int main(int argc, char *argv[]) {}
    

    argc是非负数,表述传入参数个数,argv是一个指针指向传输参数的数组头。

返回类型

  • 返回类型的几种书写方式:

    1、经典方法:位于函数头的前部,也是最常规的写法;

    2、C++11引入的方式:位于函数头的尾部;

    auto fun(int x) -> int
    {
    	return x*2;
    }
    

    3、C++14引入的方式:返回类型的自动推导;

    auto fun(int a)
    {
    	return a;		// 会根据return语句进行推导
    }
    

函数重载与解析

函数重载:使用相同的函数名定义多个函数,每个函数具有不同的参数列表;

注意:不能基于不同的返回类型进行重载;

名称查找

  • 分为限定查找和非限定查找:有无限定在某个作用域中;
  • 非限定查找会进行域的逐级查找——名称隐藏;
  • 查找通常只会在已声明的名称集合中进行;

重载解析:在名称查找的基础上进一步选择合适的调用函数;

  • 过滤不能被调用的版本:参数个数不对、无法将实参转为形参、实参不满足形参的限制条件;

内联函数

定义:将比较简单的函数逻辑展开到调用函数的部分,避免栈帧销毁,提升性能;

关键字:inline,如果一个函数在多个翻译单元展开,加入这个关键字可以避免重复定义;

constexpr函数

定义:之前有介绍常量表达式时用到了该关键字,现在对于函数也可以用该关键字;

作用:使得函数在编译器被执行,当然在有变量情况下也可在运行期执行;

constexpr int fun(int x){
    // int y; std::cin >> y;		会报错,该语句需要用户传入参数,只能在运行期执行
	return x * 2;
}

int main
{
	constexpr int x = fun(2);		// 编译器会翻译成 move eax 4, 去掉constexpr也可以
	return x;
}

注意:constexpr函数中的语句必须是可以在编译器执行的语句;

拓展:关键字consteval(C++20引入),函数只能在编译器执行;

函数指针

作用:可以用于高阶函数中,将函数指针作为参数;

代码案例

int add(x) { return x + 1};
using T = int(int);
int fun(K* F, int x)
{
	int tmp = (*F)(x);
	return tmp * 2;
}

int main
{
	std::cout << fun(&add, 50) << std::endl;
}

说明:这就是用函数指针定义的一个高阶函数,在之后的很多高阶函数、泛型算法中也是这样的用法;

注意:当函数对象进行赋值或者返回值时,返回的是一个函数指针类型的对象;

思考

1、我们常常会见到如下代码,是由什么作用?

extern "C" 
int fun(int x, int y)
{
    return x + y;
}

C语言对于函数是不能重载的,当用C调用C++程序时,往往找不到C++编译后的函数名,可通过如上代码定义一个函数为C类型函数;

2、可以用别名定义一个函数类型吗?

using X = int[3];
X a;				// 这是定义了一个数组,同int a[3]

using X = int(int);
X fun;				// 这是定义了一个int返回类型的函数

函数也是有类型的,可以用别名定义,并且函数类型不包含形参名称,并且只能声明,不能定义;

总结

本篇主要介绍了函数的基础概念以及一些特殊的函数方法和类型。重点需要注意的就是函数重载以及函数指针,这个在后续的模板以及泛型编程都会用到;下一篇将讨论C++中的内存,也是最重要的一个部分。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:08:07  更:2021-11-29 16:08:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:16:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码