• C++中的函数


    一、函数的声明

    1. 函数在定义时也同时执行了函数的声明

    2.函数的声明格式 :

    函数的声明应该包括 : 返回值类型、函数名、形参类型、(形参名)

    形参名虽然可以在函数声明时省略但建议保留,因为方便根据形参名见名知意

    void func( string name, string greeting  );
    

    2. 函数声明注意的点 :

    (1)当函数的定义 在代码中的位置 位于 该函数的调用 之后,那么,应该使用声明

    (2)声明可以描述函数参数的默认值:

    并且:函数声明参数的默认值之后,在函数定义时,不准许再对该函数的参数赋默认值(即使要赋的默认值是同一个值)

    因为:在相同的作用于空间不准许对一个函数的形参反复声明(而函数的定义也同时执行了函数的声明)

    ==》但建议定义时,默认值用注释标明,如下例:

    1. #include
    2. using namespace std ;
    3. int func1 (int a=4, int b=5) ; //函数声明的时候不要忘记加 4;
    4. int main()
    5. {
    6. cout<< func1() <
    7. cout<< func1(2,3) <
    8. }
    9. int func1(int a/*=4*/, int b/*=5*/) //注意:虽然函数定义的时候不准许在此描述参数的默认值,但,形参的数据类型和形参变量名 不可以 缺省
    10. {
    11. return a+b;
    12. }

    3. 函数声明的意义:

    函数声明可以帮助编译器检测出 函数向形参传递实参 中可能出现的 传递内容过多、缺失、类型出错 等问题 ; 也可以帮助编译器检测出 函数返回值的 数据类型、值内容 是否出错

    ==》函数的声明就类似一个主调函数与被调函数之间的协议:

    由于函数的形参和函数中的局部变量都是在一块叫运行栈的内存上分配的,所以,在函数调用时,主调函数就会一句函数的声明 把这些形参按照声明的数量和类型 压入到运行栈中,而在执行被调函数中,被调函数也可以正确的从运行栈中读取这些参数;被调函数运行完毕后,按照函数的声明,编译器也会检查返回值的数据类型是否与函数的声明一致,从而减少错误

    【与C语言不同,C++的函数声明要求指明的东西更详细:需要指明函数的形参类型、形参个数 这样就可以进一步帮助编译器检查,进而避免一些错误】

    之所以要求函数的声明是因为当整个项目代码被组织成一个多文件结构时,很难通过编译器来检查参数和返回值的合理与否,这就会导致很容易出现从运行栈中读取数据发生错误(比如本来应该读取一个float型的数据,但是读成了一个int型,这必然会导致数值上的错误,因为在内存中不管是啥值都是一串01)

    【这里有一块我没弄懂:《C++ 第四版》的 p91的 栈指针 和 帧指针 与这里也有些相关】

    二、return 关键字

    return 两个用处:(1)给有返回值的函数返回对应的返回变量

                                (2)表示函数的终止

    当一个函数没有返回值时,return可以省略,但是(为了易读)不建议省略

    当一个函数有返回值时,return 显然不可以省略

    三、 内联函数

    1. 内联函数的格式:

    内联函数与普通函数的区别只是在函数头多了关键字 inline 

    2. 内联函数的意义:

    调用函数操作 效率低 。

    内联函数 不是在调用时发生控制转移,而是 将对应的函数体 在编译的时候 嵌入在代码的每一个调用处

    ==》 将一些简单的、频繁调用的函数 写作内联函数,可以在运行时提高效率

    3. 并不是所有函数都适合作为内联函数的,eg. 递归函数 ,如果递归函数做为内联函数就会导致代码膨胀

    4. 注意:编译器并不保证 加上 inline 关键字的函数就一定设置为内联函数

    事实上,有些不加 inline 关键字的函数如果编译器觉得合适也会自动将其处理为内联函数;将递归函数加上 inline 关键字,编译器可能也不会将其作为内联函数在编译过程中就嵌入在代码中

    四、形参实参:

    1. 实参是按照从左到右的顺序与形参一一对应,没对应到实参的的地方使用形参的默认值 

    2. 在实参值传递给形参时,但数据类型准许,会发生隐式类型转换

    例如:

    1. #include
    2. #include
    3. using namespace std ;
    4. void func1 (int a=4, int b=5)
    5. {
    6. cout<
    7. return ;
    8. }
    9. int main()
    10. {
    11. func1(1.1 ,2.2);
    12. }

                    

  • 相关阅读:
    valgrind简介与使用
    配置和优化您的企业内容管理(ECM)解决方案
    soildworks2022如何快速更改草图基准面?
    阿里开源-JVM-SandBox
    浅摇自动化测试
    自动驾驶创业方向有变化?如何突破技术瓶颈?
    浅谈数据结构之队列
    人工智能(pytorch)搭建模型20-基于pytorch搭建文本生成视频的生成对抗网络,技术创新点介绍
    511. 游戏玩法分析 I
    Pandas常用操作
  • 原文地址:https://blog.csdn.net/qq_41764621/article/details/127411438