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
    [源码下载]

  • 相关阅读:
    Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
    控制‘控制台应用程序’的关闭操作
    详解for循环(各种用法)
    敏捷软件开发
    Sql Server的一些知识点
    在SharePoint 2010 中配置Remote Blob Storage FILESTREAM Provider
    使用LotusScript操作Lotus Notes RTF域
    JOpt Simple 4.5 发布,命令行解析器
    John the Ripper 1.8.0 发布,密码破解工具
    PacketFence ZEN 4.0.1 发布,网络接入控制
  • 原文地址:https://www.cnblogs.com/webabcd/p/4560130.html
Copyright © 2011-2022 走看看