C++入门篇--函数

2023-11-16

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++支持重载,这也是为什么函数重载的要求是参数不一样的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++入门篇--函数 的相关文章

随机推荐

  • 【计算机视觉40例】案例14:指纹识别

    导读 本文是专栏 计算机视觉40例简介 的第14个案例 指纹识别 该专栏简要介绍李立宗主编 计算机视觉40例 从入门到深度学习 OpenCV Python 一书的40个案例 目前 该书已经在电子工业出版社出版 大家可以在京东 淘宝 当当等平
  • 谈谈互联网免费思维

    大家好 我是测试小牛 一位平凡又普通的95后互联网博主 今天跟大家聊下互联网的免费思维 在移动互联网时代的今天 可能任何一家互联网创业公司的崛起都具备这种思维 比如当年快滴跟滴滴之争 美团跟饿了么之争 非但不收钱 还花钱大量补贴用户 去使用
  • [思考进阶]05 人与人之间的差距,在于“自律”

    除了要提升自己的技术能力 思维的学习和成长也非常非常重要 特推出此 思考进阶 系列 进行刻意练习 从而提升自己的认知 我认识两个成功的长者 其中有一个人 每天记录当天的重要事项 比如今天和谁签了什么合同 房子装修还差什么材料 女儿20岁生日
  • 【教程+实例】Python爬虫实例——用Python爬虫爬取bangumi上的galgame资讯

    文章目录 0 前言 1 什么是爬虫 2 什么东西可以爬 3 简易爬虫示例 4 如何筛选数据 5 正则表达式 6 最终代码 如何修改代码 以适应自己的需求 效果截图 7 彩蛋 本人与知乎用户间宫羽咲sama是同一人 内容同步更新在CSDN和知
  • 1.通用文件模型及VFS结构-基础

    一 reiserFS 新型文件系统 特点 1 采用完全平衡树来容纳数据 ReiserFS是基于平衡树 STree 的文件系统结构 尤其对于大量文件的巨型文件系统 如服务器上的文件系统 搜索速度要比ext2快 ext2使用局部的二分查找法 综
  • 客户服务器被 ddos 攻击,应该怎么办?

    转自 点击打开链接https www v2ex com t 145842 首页 注册 登录 V2EX way to explore V2EX 是一个关于分享和探索的地方 现在注册 已注册用户请 登录 V2EX 提问指南 广告
  • plSQL中修改代码字体的大小

    在第一次打开PLSQL时 大部分人看代码字体的大小肯定不习惯 这时候只需要修改一下字体的大小即可 首先找到左上角的 工具 然后点击第一个首选项 然后再用户界面找到 字体 最后点击编译器中的 选择 即可 然后就可以进行字体大小的调节了
  • Android推送总结

    http blog csdn net baidu 26352053 article details 54135107 最近Android开发当中推送技术是热点 互联网上不同的博客关于推送的介绍也非常的多 大致上关于推送技术 我们可以有使用第
  • JAVA_HOME is not set

    关于JAVA HOME没有设置 本人是在配置spark集群的时候显示 JAVA HOME is not set 具体如下 但是我们在 cd JAVA HOME 还是能够进去 查阅网上资料有各种各样的解决办法 但是看着没啥关系 于是我猜测是没
  • 解决百度网盘(百度云)分享链接不存在失效、分享的文件已经被取消的问题

    解决百度网盘 百度云 分享链接不存在失效 分享的文件已经被取消的问题 参考文章 1 解决百度网盘 百度云 分享链接不存在失效 分享的文件已经被取消的问题 2 https www cnblogs com hafiz p 5496391 htm
  • spring--容器创建过程(IOC和AOP的过程)

    在前面两篇中我们介绍了IOC和AOP 知道了IOC容器就是来管理每个Bean的 而AOP就是对这些Bean进行功能的拓展 那么这个过程是怎么样实现的呢 IOC和AOP又是怎么样的一个过程呢 一 Spring容器创建过程 我们通过一个简单的创
  • 配置网卡信息/etc/sysconfig/network-scripts/ifcfg-eth0,修改ip

    1 ifconfig查看ip信息 root用户下 root edgzrip2 ifconfig a eth0 Link encap Ethernet HWaddr 00 50 56 2B 27 67 inet addr 192 168 23
  • 一键列出所有容器IP地址脚本

    文章目录 使用场景 效果 列出所有容器 自动跳过无终端的容器 脚本 案例 查看网络带宽占用 过滤IP对应的容器 解决带宽占用问题 使用场景 在服务器带宽被占用 但不好定位是哪个容器时 通过用此脚本来快速过滤容器名 以便解决问题 效果 列出所
  • [C++]使用关键字new创建对象

    1 首先解释new关键字的作用 在堆中开辟指定数据类型的空间 调用指定数据类型的构造函数 创建对象 返回创建的对象 int pn new int new与delete搭配使用 这种写法 pn为栈上的一个指针 指向堆上所对应的内存块 int
  • 逻辑地址、物理地址和线性地址

    逻辑地址 logical address 包含在机器语言指令中用来指定一个操作数或一条指令的地址 这种寻址方式在80X86著名的分段结构中表现的尤为具体 它促使MS DOS或Windows程序员把程序分成若干段 每一个逻辑地址都由一个段 s
  • 【pyspark】DataFrame基础操作(二)

    介绍一下 pyspark 的 DataFrame 基础操作 一 选择和访问数据 PySpark DataFrame 是惰性计算的 简单地选择一列不会触发计算 但它会返回一个 Column 实例 并且 大多数按列操作都返回 Column 实例
  • 代码审计工具学习之Seay(安装以及初步认识)

    目录 1 1名词解释 1 2代码审计的重要性 1 3代码审计的步骤 1 4代码审计的内容 1 5常见的代码审计工具 2 Seay 2 1什么是Seay 2 2 Seay的安装过程 3典型漏洞分析 3 1什么是命令注入漏洞 3 2 如何理解命
  • Windows下运用Tensorflow object detection API训练出现的问题--爬坑

    刚开始学习Tensorflow object detection API遇到了不少问题 下面就遇到的问题做下记录 我是在CPU下训练的模型 然后遇到训练到一百多步的时候会报这个错误 如图 用的训练模型为ssd mobilenet v1 co
  • VS2010中dumpbin工具的使用

    用VS2010生成的 obj文件 lib库 dll库 exe执行文件 如果想查看其中这些文件或库包含了哪些函数以及相关的信息 符号清单 可以通过VS2010自带的dumpbin工具来完成 dumpbin exe为Microsoft COFF
  • C++入门篇--函数

    C 的函数和C语言的函数是差不多的 都是把要重复使用的代码封装起来 以便我们后续使用 而C 的函数在c语言上右增加了几个特性 那就是缺省参数和函数重载 这一篇就分享一下C 函数的这些特性 开篇 说到函数 自然得提一下C 的输入函数和输出函数