ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cpp-函数

2022-08-13 10:03:51  阅读:269  来源: 互联网

标签:调用 函数 定义 编译 cpp 全局变量 变量


目录

1.基础概念

形参与实参

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

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

参数传递的方式

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

函数的声明

[extern] returnType funName (factor1,factor2,....);

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

全局变量

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

  1. 定义在函数外:valType valName
  2. 定义在函数内:extern valType valName

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

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

程序模块

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

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

文件包含命令

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

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

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

3.命名空间

命名空间的定义

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

命名空间的使用

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

  1. 通过作用域解析符::

    作用域解析符一般用于某个域下的单个函数/变量。如someName::val1

    注意:::val可以调用全局变量,如下例所示

    using namespace std;
    int a = 1;
    int main(void){
        int a = 0;
        cout << a <<endl; 
        #printing local a:0
        cout << ::a << endl;
        #printing global a:1
    }
    
  2. 通过关键字using

    该关键字的作用域根据定义的位置分为:全局、局部两种方式。若要局部使用,一般写在函数体内;若要全局使用,一般像全局变量一样,写在main()函数外。

    关键字using既可以像使用全局变量一般,也可以指定单个的函数/变量。

    • using someName:使用整个someName下定义的变量
    • using someName::val1:使用someName下定义的val1

4.存储类修饰符

变量的生存周期

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

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

存储类修饰符

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

auto和register

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

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

static

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

  1. 使用static定义的变量应当先进行初始化,但若未进行初始化,则编译器会根据其类型大小,将内存按位取0以为其赋值。相比之下,局部变量若未初始化,其值是原内存中存放的数,是不确定的。
  2. 在函数中使用static定义的局部变量有了封装特性,即是说该函数以外的方法/调用都是不合法的,只有该函数内地的方法才能够对其访问
  3. 多次调用含有定义static局部变量的函数,只有第一次的调用会依据定义对其初始化,往后的调用只会使用上一次的、已经存在的值

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

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

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

6.宏定义与内联函数

宏定义

宏定义的格式为#define marcroName sth

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

此外,宏定义还可以执行类似函数的功能,叫做宏调用

格式为:#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,....)

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

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

标签:调用,函数,定义,编译,cpp,全局变量,变量
来源: https://www.cnblogs.com/dysonxxxxx/p/16582078.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有