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++的函数和C语言的函数是差不多的,都是把要重复使用的代码封装起来,以便我们后续使用。而C++的函数在c语言上右增加了几个特性,那就是缺省参数函数重载,这一篇就分享一下C++函数的这些特性。

开篇

说到函数,自然得提一下C++的输入函数和输出函数。我们在C语言中使用的是printf函数和scanf函数,在使用这两个函数时需要引入#include <stdio.h>头文件。而在C++中除了可以使用这两个输入输出函数之外还可以使用cin函数和cout函数,使用这两个函数需要引入#include<iostream>文件。使用语法如下

#include<iostream>
using namesapce std; // 输入输出流的函数定义在命名空间std中
int main(){
    cout<< "hello yubaobei" << endl; // endl的作用是换行
    cout<< "hello yubaobei\n"; //这样写也可以换行
    return 0;
}

在这里插入图片描述

注意

使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含头文件以及std标准命名空间。

使用标准输入输出流的好处是cout函数和cin函数可以自动识别数据类型,这个功能很好用。

#include<iostream>
using namespace std;
int main(){
    int a = 10;
    double b = 20;
    char c = 0;
    
    cin>>a; // 输入函数cin
    cout<<b<<" "<<a<<endl;
    return 0;
}

在这里插入图片描述

如果想要按自己的想的格式化输出,还是用printf函数,因为cout函数要实现格式化输出很麻烦。


缺省参数

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

void TestFunc(int a = 10){
    cout<<a<<endl;
}

int main(){
    TestFunc(); // 没传参时就使用参数的默认值
    TestFunc(100); // 传了参数,就使用传的值
    return 0;
}

在这里插入图片描述

全缺省参数

全缺省参数,故名思意,就是函数的每一个参数都有一个默认值。在调用函数的时候,可以只传一个参数,可以只传两个参数,可以不穿参数,也可以三个都传。

void TestFunc2(int a = 10, int b = 20, int c = 30){
    cout<<"a= "<<a<<endl;
    cout<<"b= "<<b<<endl;
    cout<<"c= "<<c<<endl;
}

在这里插入图片描述

半缺省参数

半缺省参数必须从右往左依次给出,下面这种半缺省参数函数的传参,至少传一个参数。

void TestFunc3(int a, int b = 0, int c = 1){
    cout<<"a= "<<a<<endl;
    cout<<"b= "<<b<<endl;
    cout<<"c= "<<c<<endl;
}

在这里插入图片描述

注意:

  1. 不管是半缺省参数函数还是全缺省参数函数,缺省参数不能在函数声明和定义中同时出现。
  2. 推荐将缺省参数写在声明,不写在定义。

函数重载

函数重载是函数的一种特殊情况,C++允许在同一作用域中申明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 参数类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。

int Add(int a, int b){
    return a+b;
}
// 参数个数不同
int Add(int a, int b, int c){
    return a+b+c;
}
// 参数类型不同
double Add(double a, int b){
    return a+b;
}
// 参数顺序不同
double Add(int b, double a){
    return a + b;
}

注意:返回值类型不同不属于函数重载

函数重载的原理

为什么C++支持函数重载,而C语言不支持呢?这是跟两种语言的编译有关的,C++在编译函数的时候会对函数进行名字修饰

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接

预处理阶段:头文件展开、宏替换、条件编译、去掉注释

编译阶段:检查语法,生成汇编代码。

汇编阶段:汇编代码转换为二进制机器码

链接:如果程序是写在几个文件中,那么在连接阶段就会把程序链接起来。


#include<stdio.h>
#include<stdlib.h>

int test1(int a, int b) {
    int tmp = a + b;
    return tmp;
}

int main() {
    int ret = test1(1,2);
    printf("%d", ret);

    return 0;
}

以上面这个函数为例,程序从main函数开始执行,当执行到 ret = test1(1,2);这一步时,就调用了test1函数,它是怎么去调用的呢,我们看看汇编代码

在这里插入图片描述

当汇编代码执行到_test1(089100Ah)的时候,call这个指令的是先将call指令的下一条指令的IP入栈,然后跳到以内存单元地址为IP的代码处,这句的意思就是跳转到地址为089100Ah的位置,那么089100Ah处是执行指令呢?

在这里插入图片描述

089100Ah这个位置执行的是跳转指令,跳转到函数所在的位置,就开始执行函数。

在这里插入图片描述

也就是说,在编译过程中,编译器,会去找函数的地址,生成一个地址表,这个地址表里包含了函数名和函数的地址。当我们去用这个函数的时候,就会根据地址表找到相应的函数。

而C++之所以能够实现函数重载,是因为它对函数地址表的函数名有名字修饰。通过上图我们可以看见C语言的函数地址,是_test1,也就是说,我们怎么命名的函数,在地址表中它就是怎么命名的。而C++的不一样。

下面我们在C++程序中定义两个函数Add,他们的函数名是一样的,参数不一样,所以是函数重载

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
C++的地址表中,我们的Add函数的名字并不像C语言中的一样,在linux中C++的名字修饰是,_z + 函数名的长度 + 函数名 + 两个参数的类型,而c语言就是将函数名作为地址表的名字,所以,C语言在链接的过程中,如果有两个函数名一样的函数,就不到要去找那个地址,就会有问题,而C++因为名字经过修饰,即使两个函数的函数名一样,可参数不一样,在地址表中就不会出现两个名字一样的函数地址不一样这种情况。所以C++支持重载,这也是为什么函数重载的要求是参数不一样的原因。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 11:51:56  更:2021-12-05 11:53:14 
 
开发: 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 10:35:49-

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