標籤:
[源碼下載]
不可或缺 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、總之,如果不值當的(執行效率提高小,代碼膨脹大),建議不用 inlineinline 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
[源碼下載]
不可或缺 Windows Native (16) - C++: 函數重載, 預設參數, 內嵌函式, 函數模板