cpp-函数

1.基础概念

形参:用在定义、申明处的参数,用于说明参数的类型、名称

实参:用在函数调用,用于传递参数的值

  • 值传递:是cpp对于除了 数组外的数据类型的参数传递方式。值传递中,参数是一个表达式,计算后的表达式会传至函数中。
  • 地址传递(引用传递)
[extern] returnType funName (factor1,factor2,....);

函数的声明与函数的定义几乎一致,只是声明在写参数表时可以只写参数类型,而忽略参数名称。用于使编译器理解未在当前行前段定义的函数。其中的 extern可以省略。

指定义在函数外的变量。全局变量的定义方式有两种,

同时注意:全局变量与函数一样,若在调用时未到定义处,则需要对全局变量进行声明。

2.程序模块与文件包含命令

一个程序模块一般包含: 模块接口模块实现两个部分。

  • 模块接口:指的是函数、全局变量的声明,即是 .h文件
  • 模块实现:指的是源文件,存放了接口的实现,即是 .cpp文件

文件包含命令即是 #include命令,它是编译预处理命令,在编译阶段系统会到指定目录下完成将 #include替换作对应文件内容的工作。

#include后的头文件可以有两种写法,

  • #include <some.h></some.h>:编译系统会直接前往指定的地址中搜索对应的文件,并完成替换
  • #include "some.h":编译系统会优先在当前的、与这条命令所属的文件对应的文件目录下搜索对应文件,之后才会去指定的地址中搜索

3.命名空间

namespace someName{
    val1,.....;
    fun1(){
        sth;
    }
}
  • 命名空间像大括号一样,将一些定义如全局变量、函数等包裹起来,在这个大括号内的定义使用该名称。
  • 命名空间的定义可以不连续,如下例所示
namespace sth{
    sth,....;
}
fun(){
    bluh...;
    #这部分不在sth的命名空间内,因为他不在该括号中
}
namespace sth{
    sth2,....;
    #这部分与第一部分一样,都属于命名空间sth
}
  • 命名空间可以嵌套定义
  • 可以定义没有名字的命名空间,如下
namespace {
    sth,...;
}

命名空间的使用有两种方式:

4.存储类修饰符

变量的生存周期可以分为3类:静态生存周期、自动生存周期、动态生存周期。

  • 静态生存期:变量从程序开始执行时就被分配内存,直至该程序结束时空间才被回收
  • 自动生存期:变量从程序执行到他的定义处时被分配内存,到定义他们的复合语句结束时被回收
  • 动态生存期:对应于被关键字 new定义的变量,用 delete回收

在定义变量时存储类修饰符有三个: autostaticregister。他们用在定义变量时,写在变量的类型名前。如 auto int i = 1

auto是局部变量的默认/缺省分配方式。对应定义后的变量生存周期类别为自动生存周期。

register也用于定义局部变量,且变量也对应于自动生存周期。与 auto不同的是, register提示编译器将该变量存放在cpu的寄存器中,以期望获得更快的访问速度。不过使用 register定义的变量不一定都在cpu寄存器中,还取决于cpu当时的寄存器情况;同理,使用 auto定义的局部变量也有可能被编译器优化至cpu寄存器中。

static定义的变量对应于静态生存周期。一般存放在静态数据区中。

5.函数执行时栈的变化情况

函数从上至下一行行执行,变量也按照顺序先后入栈。

当执行函数时,调用者会在自己的栈中给按序先给返回值和形参分配空间(即是说先给返回值申请空间并将申请到的空间地址入栈,之后在申请形参的值并入栈)

6.宏定义与内联函数

宏定义的格式为 #define marcroName sth

宏定义由编译预处理系统在编译前完成替换,即是用 sth来替代 macroNmae,二者之间以空格隔开。

此外,宏定义还可以执行类似函数的功能,叫做 &#x5B8F;&#x8C03;&#x7528;

格式为: #define marcroName(valA, valB,...) sthThatIncludeA&B

通过像函数一样的调用方式 macroName(val1,val2)即可,预编译会将宏定义与参数转化为相应的内容。与普通的函数相比,宏调用节约了调用开销。

内联函数是指在函数返回值类型前加关键字 inline来构成的函数。内联函数可以实现宏调用类似的功能,即尽量节省调用开销/函数调用效率不高的问题。

一般来说,添加内联关键字 inline后内联函数会在被调用处将该函数定义复制到调用处,即函数调用这种模块化编程依靠编译器变成了过程化编程。但关键字 inline只是告诉编译器这个函数应当作为内联函数来展开,而依据编译程序的实现,在调用处该函数也有可能不被复制展开。

7.条件编译

条件编译是指,如果某个宏定义了/某个常量表达式的值不为0,那么编译器编译列在该条件下的代码。格式如下:

//第一种形式
#ifdef SomeMarcro
#include ....

...;
#else
#endif
//第二种形式
#if Expressiong
#include .....

.....;
#else
#endif
  • 当为 ifdef时,宏定义长协在代码的开头部分
  • 还有一种形式为 ifndef,其作用是如果某个宏没有定义,那么编译其下的代码
  • 注意 endif要编写在所有条件编译都结束之后

一种常见的条件编译使用方式,常根据宏定义来完成版本控制:

//先将必要的函数写在条件编译外
......;//必要的函数,其中包含了ifdef需要的宏
#define A
//编写有A定义时的代码
.......;
#else
//对应没有A定义时的代码
#endif

8.为参数指定默认值

格式: valType funName(type val1, type val2 = 1, type val3 = 4,....)

在函数的声明时,可以为一些参数指定在缺省时的值。注意只能在函数声明时指定默认值,而不能在定义时指定。若该定义同时也为声明,则可以指定(即第一次出现该函数就定义时)。

_特别注意:_当要指定默认值时,要将所有带默认值的参数放在不带默认值参数的右边

Original: https://www.cnblogs.com/dysonxxxxx/p/16582078.html
Author: dysonkkk
Title: cpp-函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578838/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 阿里云OSS + PicGo搭建图床

    配置 PicGo 下载安装完成后,打开 PicGo,配置阿里云 OSS。 其中,KeyId 即创建 RAM 用户的 AccessKey ID,KeySecret 即 AccessK…

    Linux 2023年6月7日
    0114
  • MSSQL中完整备份及完整还原的T-SQL实践

    | 0.37分钟 | 596.8字符 | 1、引言&背景 2、完整备份 3、完整还原 4、声明与参考资料 | SCscHero | 2022/5/27 AM12:47 | …

    Linux 2023年6月14日
    075
  • flask的使用

    python网站开发框架: django:大而全 flask:小而精 flask的web服务器:werkzeug 模板语法: jinjia2,兼容dtl 登录案例: from fl…

    Linux 2023年6月14日
    091
  • 编程模式-表驱动编程

    刚开始编程时,往往会碰到一些根据不同条件执行不同功能的情况,通常都是采用if-else或者switch-case的方式,如果有很多的情况需要区分,则会有很多的 else if 或者…

    Linux 2023年6月7日
    0107
  • shell常用集锦

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    0104
  • 【转】我是一个CPU:这个世界慢!死!了!

    简介 经常听到有人说磁盘很慢、网络很卡,这都是站在人类的感知维度去表述的,比如拷贝一个文件到硬盘需要几分钟到几十分钟,够我去吃个饭啦;而从网络下载一部电影,有时候需要几个小时,我都…

    Linux 2023年6月16日
    0134
  • RHCSA阶段笔记

    命令终端字段含义介绍 [root@localhost ~]# 解释: root:当前登录系统用户名(root超级管理员) localhost :当前主机名 :当前用户所在目录( 为…

    Linux 2023年5月27日
    078
  • Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函…

    Linux 2023年6月8日
    0128
  • Celery + Redis 的探究

    不在乎过程的,可以直接看最后的结论。 测试代码: 先将 redis 部署于本机的 6379 默认端口 不要设置密码,使用 celery 版本 3.1.23 [1]先直接发起一个 t…

    Linux 2023年5月28日
    067
  • 记一次echo server出现的问题

    1. 我做了什么 最近在学习如何用select函数实现echo server。期间遇到了一个关于缓冲区的问题,在这里分享给大家。 在使用read/recv, write/send类…

    Linux 2023年6月7日
    092
  • Jenkins初始化界面一直显示Please wait while Jenkins is getting ready to work …

    第一次访问 jenkins时,会提示如下界面: 注:如果这个界面初始化的时间过长,则需要修改相关配置文件。 原因:因为访问官网太慢。我们只需要换一个源,不使用官网的源即可。 1、找…

    Linux 2023年6月13日
    086
  • 免外围电路ESP32/ESP8266系列单片机串口一键下载方案

    一、概述 CH340X、CH343、CH342等USB转串口芯片支持免外围电路ESP32/ESP8266等单片机串口一键下载功能,对此类支持多模式启动的单片机,无需外围三极管等逻辑…

    Linux 2023年6月7日
    0121
  • 022.常见硬盘检测方式

    硬盘监测概述 硬盘异常损坏日常相对概率较高,同时不同的文件系统(xfs,reiserfs,ext3)其检测方式不同。建议使用dmesag查看有没有硬件I/O故障的日志,也可使用用f…

    Linux 2023年6月7日
    081
  • 开发环境的搭建

    ​ 一:ubuntu14.04 LTS开发环境搭建 1.1、参考博客 参考的教程如下: ubuntu老版本下载地址 VMware下Ubuntu Server 14.04安装教程(最…

    Linux 2023年6月13日
    079
  • 【socket】基于socket通信-线程上报温度

    线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变…

    Linux 2023年6月13日
    096
  • 关于网络安全防护架构中的DMZ区

    公司有一个网站群的业务,应用规模比较大,目前计划是从传统的虚拟机部署方式迁移到内部的私有云。 这种迁移的动作是一个很好的学习机会。在交流的时候的时候,领导有提到现有的架构基本上是参…

    Linux 2023年6月14日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球