C++——初识模板

模板

1.意义:以达到泛型编程的目的。所谓泛型编程,就是程序代码不受类型的限制。

一.函数模板

1.格式:

template  <typename T1,typename T2,  ……>

返回值类型  函数名  (参数列表) {  }

这里的关键字typename也可以用class代替。

2.例:

template <class T>
void Swap(T& a, T& b) {
	T temp = a;
	a = b;
	b = temp;
}

3.函数模板的实例化:用不同类型的参数使用模板。

(1)隐式实例化:让编译器根据实参来推演出参数的类型,进而确定调用那种类型的函数。

	int a = 10, b = 20;
	cout << "a=" << a << "\nb=" << b << endl;
	Swap(a, b);

(2)显式实例化:在函数名后的<>中指出参数的类型。

	int a = 10;
	double b = 20.0;
	Swap(a, b);        
//此时调用函数就会出错,因为模板参数只有一个,
//但是传进去的是两个不同类型的参数,编译器无法辨别该调用哪个函数
//解决方法:
//1.强制类型转换
Swap(a,(int)b);
//2.显式实例化
Swap<int>(a,b);

4..函数模板与同名的非模板函数的调用规则:

先调用参数匹配的非模板函数;如果没有,再调用函数模板。

例:

template <class T>
void Swap(T& a, T& b) {
	T temp = a;
	a = b;
	b = temp;
}

void Swap(int &a, int &b) {
	int temp = a;
	a = b;
	b = temp;
}
void test(){

	int a = 10, b = 20;
	cout << "a=" << a << "\nb=" << b << endl;
	Swap(a, b);
}

此时,由于有参数类型完全匹配的非模板函数,调用的就是非模板函数。

二.类模板

1.格式:

template <typename T1,……>

class 类名{

      类成员

}

2.例

template <class T>
class compare {
private:
	T x, y;
public:
	 compare(T a, T b) {
		x = a;
		y = b;
	}
	T max();
};

注意:在类外定义模板类的成员函数时需要加上template <class T>

例:

template <class T>
T compare<T>::max() {
	return x > y ? x : y;
}

3.类模板的实例化:

类名 <类型> 对象名

例:

	compare<int> a(1, 2);
	cout << a.max() << endl;
发布了58 篇原创文章 · 获赞 43 · 访问量 4411

猜你喜欢

转载自blog.csdn.net/Wz_still_shuai/article/details/90407164