标签:
1. 发散性问题:C++中的几种交换变量的方法
(1)宏代码块 VS 函数
【编程实验】变量的交换
#include <iostream> #include <string> 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 c = a; a = b; b = c; } void Swap(double& a, double& b) { double c = a; a = b; b = c; } void Swap(string& a, string& b) { string c = a; a = b; b = c; } int main() { int a = 0; int b = 1; Swap(a, b); //Swap(int&, int&) cout << "a = " << a << endl; cout << "b = " << b << endl; SWAP(int, a, b); //宏代码 cout << "a = " << a << endl; cout << "b = " << b << endl; double m = 2; double n = 3; Swap(m, n); //Swap(double&, double&) cout << "m = " << m << endl; cout << "n = " << n << endl; SWAP(double, m, n); //宏代码 cout << "m = " << m << endl; cout << "n = " << n << endl; string s = "Santa"; string c = "Claus"; Swap(s, c); cout << "s = " << s << endl; cout << "c = " << c << endl; SWAP(string,s, c); cout << "s = " << s << endl; cout << "c = " << c << endl; return 0; }
(2)优缺点比较
|
宏义宏代码块 |
定义函数 |
优点 |
代码复用,适合所有类型 |
真正的函数调用,编译器对类型进行检查 |
缺点 |
编译器不知道宏的存在,缺少类型检查 |
根据类型重复定义函数,无法代码复用 |
2.新的解决方案——泛型编程
(1)不考虑具体数据类型的编程,集合了上述两种方案的优点。
(2)函数模板:C++中的泛型
①一种特殊的函数可用不同类型进行调用
②看起来和普通函数很相似,区别是类型可被参数化,如
template<typename T>
void Swap(T& a, T& b)
(3)函数模板的语法规则
①template关键字用于声明开始进行泛型编程
②typename关键字用于声明泛指类型
3. 函数模板的使用
(1)自动类型推导调用
int a = 0, b = 1;
Swap(a, b); //自动推导
(2)具体类型显式调用
float c = 2, d = 3;
Swap<float>(c, d); //显式调用
【编程实验】函数模板使用初探
#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 SelectSort(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); SelectSort(a, 5); Println(a, 5); string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"}; Println(s, 5); SelectSort(s, 5); Println(s, 5); return 0; }
4. 小结
(1)函数模板是泛型编程在C++中的应用方式之一
(2)函数模板能够根据实参对参数类型进行推导
(3)函数模板支持显式的指定参数类型
(4)函数模板是C++中重要的代码复用方式
标签:
原文地址:http://www.cnblogs.com/5iedu/p/5617055.html