zoukankan      html  css  js  c++  java
  • const引用和函数占位参数遇上默认参数以及内联函数

    1.const引用:

    但是加上const之后是可以的,const int &a=100;就不会报错了。

    2.函数占位参数:

    如果给最后的占位参数加上默认值:

     3.内联函数

    内联只是对编译器发起一个申请,编译器可以拒绝用户的请求。内联函数只用在普通函数的开头加上inline关键字。

    当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。节省时间但是消耗空间。

    inline函数的规则

    (1)含有递归调用的函数不能设置为inline;

    (2)使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;

    (3)由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。

    (4)inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。

    (5)在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。比如下面代码片段: 
    //函数一开始没有被声明为inline: 
    void foo(); 
    //然后就有代码调用它: 
    foo(); 
    //在调用后才有定义函数为inline: 
    inline void foo() 

    ...... 

    代码是的foo()函数最终没有实现inline;

    如果一开始foo函数被声明成了inline,但是定义的时候没有inline关键字,同样不能内联。

    C++ inline函数是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。STM32中也是这样的,程序设计风格应该是只用定义即可,可放在头文件中。

    (6)为了调试方便,在程序处于调试(release版本可以)阶段时,所有内联函数都不被实现。

    (7)定义在类声明之中的成员函数将自动地成为内联函数

    内联函数,和其他函数还有不同在于,内联函数可以定义在头文件中。

    constexpr函数:函数的返回值和参数类型必须是字面值类型(如int ,指针,引用等,类 类型不属于字面值类型),而且函数体中只有一条return语句。

     除了内联函数之外,c++还有constexpr函数,这个感觉是语法糖,一般我们使用不到,constexpr函数和内联函数一样,定义在头文件中也可以。

    对于给定的内联函数或者constxepr函数它的多个定义必须完全一致(c3p书上这样的说,内联函数和constxepr函数可以被多次定义,不是很理解),基于这个原因,他们通常被定义在头文件中。头文件依旧需要使用#ifndef保护,定义两个一模一样的内联函数也是会报错的。测试了,定义相同的内联函数会报错,也打开了gcc、g++的内联选项。不过,内联函数一般而言我们也用不到,只是不明白这里为什么和书上说的不一致。

    猜测书上说的多次定义,实际上并不是我们理解的可以多次定义(多次定义必然报错),放在头文件中,还是应该加上头文件保护,并加上static关键字,这样保证不出错。

    当然,使用#pragma once的头文件保护措施更好。

  • 相关阅读:
    [SNOI2019]数论
    2018-8-10-C#-写系统日志
    2018-8-10-C#-写系统日志
    2019-3-1-C#-double-好用的扩展
    2019-3-1-C#-double-好用的扩展
    2019-8-31-dotnet-Framework-源代码-·-Ink
    2019-8-31-dotnet-Framework-源代码-·-Ink
    2019-8-31-How-to-fix-nuget-Unrecognized-license-type-MIT-when-pack
    2019-8-31-How-to-fix-nuget-Unrecognized-license-type-MIT-when-pack
    2018-9-30-C#-传入-params-object-长度
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/9627947.html
Copyright © 2011-2022 走看看