zoukankan      html  css  js  c++  java
  • 不可或缺 Windows Native (16)

    [源码下载]


    不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板



    作者:webabcd


    介绍
    不可或缺 Windows Native 之 C++

    • 函数重载
    • 缺省参数
    • 内联函数
    • 函数模板



    示例
    1、函数重载, 缺省参数
    CppFunction1.h

    #pragma once 
    
    #include <string>
    
    using namespace std;
    
    namespace NativeDll
    {
        class CppFunction1
        {
        public:
            string Demo();
        };
    }

    CppFunction1.cpp

    /*
     * 函数重载,缺省参数
     */
    
    #include "pch.h" 
    #include "CppFunction1.h" 
    #include "cppHelper.h" 
    
    using namespace NativeDll;
    
    string CppFunction1::Demo()
    {
        // 函数重载(overload) - 根据参数类型和个数做函数重载(不能仅按返回值类型来做函数重载)
        string function1_get();
        string function1_get(string s1);
        string function1_get(int i1);
        string result1 = function1_get(); // function1_get
        string result2 = function1_get("abc"); // function1_get abc
        string result3 = function1_get(100); // function1_get 100
    
    
        // 缺省参数 - 函数参数允许有缺省值,为某个参数提供缺省值后,则必须为其后面的参数提供缺省值
        int function1_sum(int x, int y = 1, int z = 2);
        int a = function1_sum(100); // 103
        int b = function1_sum(100, 100); // 202
        int c = function1_sum(100, 100, 100); // 300
    
    
        return "看代码及注释吧";
    }
    
    
    // 如果函数参数有缺省值,且有函数声明的话,则缺省值应该在函数声明处指定(此时在函数定义处指定函数缺省值是无效的)
    int function1_sum(int x, int y, int z) 
    { 
        return x + y + z; 
    }
    
    
    // 以下几个函数用于演示函数重载
    string function1_get()
    {
        return "function1_get";
    }
    /*
    不能仅按返回值类型来做函数重载(有这句的话会编译错误)
    int function1_get()
    {
        return 100;
    }
    */
    string function1_get(string s1)
    {
        return "function1_get " + s1;
    }
    string function1_get(int i1)
    {
        return "function1_get " + int2string(i1);
    }

     
    2、内联函数, 函数模板
    CppFunction2.h

    #pragma once 
    
    #include <string>
    
    using namespace std;
    
    namespace NativeDll
    {
        class CppFunction2
        {
        public:
            string Demo();
        };
    }

    CppFunction2.cpp

    /*
     * 内联函数,函数模板
     */
    
    #include "pch.h" 
    #include "CppFunction2.h" 
    
    using namespace NativeDll;
    
    void function2_demo1();
    void function2_demo2();
    
    string CppFunction2::Demo()
    {
        // 内联(inline)函数
        function2_demo1();
    
        // 函数模板(function template)
        function2_demo2();
    
        return "看代码及注释吧";
    }
    
    
    
    // 声明一个 inline 函数(左侧加 inline)
    inline int function2_max(int i, int j);
    
    // 内联(inline)函数的使用
    void function2_demo1()
    {
        int a = 1, b = 2;
        int x;
    
        // 内联函数(内置函数,内嵌函数,inline) - 在编译时将所调用函数的代码直接嵌入到主调函数中
        x = function2_max(a, b); // 2
    
        /*
        inline 函数会在编译时直接替换(类似宏替换),上面调用了 inline 函数,在编译时会被替换为如下代码
        if (a > b)
            x = a;
        x = b;
        */
    }
    
    // 定义一个 inline 函数(左侧加 inline)
    // 注意:从 inline 的原理看,其是以代码膨胀(复制)为代价,省去了函数调用的开销,从而提高函数的执行效率
    // 1、当函数包含复杂的控制语句,如循环语句或 switch 语句或递归之类的时,不宜用 inline 函数
    // 2、一般只将规模很小(5 句以下)且使用频繁的函数声明为 inline
    // 3、总之,如果不值当的(执行效率提高小,代码膨胀大),建议不用 inline
    inline int function2_max(int i, int j) 
    {
        if (i > j)
            return i;
        return j;
    }
    
    
    
    // 声明一个函数模板,其有两个不定类型,分别为 T1 和 T2(typename 和 class 没有区别)
    template<typename T1, class T2>
    
    // 使用上面的函数模板中定义的类型,定义一个函数
    T1 function2_template(T1 a, T2 b, int c) // 使用了函数模板的函数就是模板函数
    {
        if (a > b)
            return a;
        return a + 100;
    }
    
    /*
    这种写法是错误的,因为推导不出返回值的类型
    T2 function2_template(T1 a, T1 b)
    {
        if (a > b)
            return 100
        return 1000;
    }
    */
    
    void function2_demo2()
    {
        float result;
        float i = 1.1f;
        int j = 2;
    
        // 调用指定的函数,此函数有不定类型的参数
        result = function2_template(i, j, 0); // 101.1
    }



    OK
    [源码下载]

  • 相关阅读:
    网络对抗技术 20181216 Exp6 MSF基础应用
    实验一-密码引擎-加密API研究
    网络对抗技术 20181216 Exp5 信息搜集与漏洞扫描
    网络对抗技术 20181216 Exp4 恶意代码分析原理与实践说明
    网络对抗技术 20181216 Exp3 免杀原理与实践
    用Visual Studio 2019 创建C#窗体项目
    EL表达式的学习
    session学习
    mysql+javaWeb+jdbc+tomcat开发中的中文乱码处理
    java集合
  • 原文地址:https://www.cnblogs.com/webabcd/p/4560130.html
Copyright © 2011-2022 走看看