1、发散性问题:C++中的几种交换变量的方法。
1.1、宏代码块 VS 函数
/************** 变量的交换 *************/
#include <iostream>
#include <string>
using namespace std;
//宏定义代码块
#define SWAP(t, a, b)\
do \
{ \
t qq = a; \
a = b; \
b = qq; \
}while(0) //这里不加这个分号; 可能是保证一个整体,保证当做一条语句处理。
/*
for(...) SWAP(...); 考虑一下这种情况
*/
//定义函数方式
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 = "China";
string c = "America";
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;
}
1.2、优缺点比较
总结:
泛型的编程就是为了解决代码复用的问题,并且进行类型检查。
2、新的解决方案-- 泛型编程
2.1、
不考虑
具体数据类型
的编程,集合了上述两种方案的优点。
2.2、
函数模板:C++中的泛型
2.2.1、
一种
特殊的函数
可用
不同类型
进行调用
2.2.2、
看起来和普通函数很相似,区别是
类型可被参数化
,如
template<typename T>
void Swap(
T
& a,
T
& b)
2.3、
函数模板的语法规则
2.3.1、
template
关键字用于声明
开始进行泛型编程
2.3.2、
typename
关键字用于声明
泛指类型
3、函数模板的使用
3.1、
自动类型推导
调用
int a = 0, b = 1;
Swap(a, b); //自动推导
3.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、小结
4.1、
函数模板是泛型编程在C++中的应用方式之一
4.2、
函数模板能够根据
实参对参数类型
进行推导
4.3、
函数模板支持
显式的指定参数类型
4.4、
函数模板是C++中重要的代码复用方式
每一项技术都是为了解决一个特定的问题