一、交换变量的方法
1、定义宏代码块
(1)、优点:代码复用,适合所有的类型
(2)、缺点:编译器不知道宏在哪,缺少类型检查
2、定义函数
(1)、优点:真正的函数调用,编译器对类型进行检查
(2)、缺点:根据类型重复定义函数,无法代码复用
#include<iostream> using namespace std; #define SWAP(t, a, b) do { t c = a; a = b; b = c; }while(0) void swap(int& a, int& b) { int i = a; a = b; b = i; } /* void swap(double& a, double& b) { int i = a; a = b; b = i; } */ int main() { int a = 1; int b = 2; swap(a, b); cout << "swap(a, b):" << a << "," << b << endl;// 输2,1 SWAP(int, a, b); cout << "SWAP(int, a, b):" << a << "," << b << endl;//输出1, 2 return 0; }
二、泛型编程与函数模板
1、泛型编程的概念:不考虑具体类型的编程方式
2、c++中的泛型编程:函数模板
(1)、一种特殊的函数可用不同的类型来调用
(2)、看起来和普通函数很类似,区别是类型可被参数化
3、函数模板的语法规则
(1)、template关键字用于声明开始进行泛型编程
(2)、typename关键字用于声明泛指类型
4、函数模板的使用
(1)、自动推导调用
(2)、具体类型显示调用
#include <iostream> #include <string> using namespace std; template < typename T > void Swap(T& a, T& b) { T c = a; a = b; b = c; } template < typename T > void Sort(T a[], int len) { for(int i=0; i<len; i++) { for(int j=i; j<len; j++) { if( a[i] > a[j] ) { Swap(a[i], a[j]); } } } } template < typename T > void Println(T a[], int len) { for(int i=0; i<len; i++) { cout << a[i] << ", "; } cout << endl; } int main() { int a[5] = {5, 3, 2, 4, 1}; Println(a, 5); Sort(a, 5); Println(a, 5); string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"}; Println(s, 5); Sort(s, 5); Println(s, 5); return 0; }
三、小结
(1)、函数模板是泛型编程在c++中的应用方法之一(还有类模板等)
(2)、函数模板能够根据实参对参数类型进行推导
(3)、函数模板支持显示地指定参数类型
(4)、函数模板是c++中重要的代码复用方式