不可或缺 Windows Native 之 C++: 函数重载, 缺省参数, 内联函数, 函数模板
不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
介绍
不可或缺 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