C++:模板

#include <iostream>
#include <string>
using namespace std;

//函数模板,有自动类型推导,也可以使用显式指定类型
template<typename T>
void fun(T &a, T &b)
{
	T temp = a;
	a = b;
	b = temp;
}
template<typename T>
void swap(T x[],int len)
{
	for (int i = 0; i < len; i++)
	{
		int temp = i;
		for (int j = i + 1; j < len; j++)
		{
			if (x[temp]> x[j])
			{
				temp = j;
			}
		}
		if (i != temp)
		{
			T y = x[i];
			x[i] = x[temp];
			x[temp] = y;
		}	
	}
	for (int i = 0; i < 10; i++)
	{
		cout << x[i] << '\t';
	}
	cout << endl;
}
void test01()
{
	int x = 9, y = 10;
	fun<int>(x, y);
	cout << "x:" << x << "\ty:" << y << endl;
	
	int z[10] = { 56,58,12,56,88,46,87,45,11,54 };
	swap(z,sizeof(z)/sizeof(int));

	char s[] = "cbsdawh";
	swap(s, sizeof(s) / sizeof(char)-1);
}


//类模板,没有自动类型推导但是可以有默认参数
//类模板中函数的创建时机,只有当使用时才会创建
template<typename MYname = string, typename MYage = int>
class Person
{
public:
	Person(MYname name, MYage age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	MYname m_name;
	MYage m_age;
};
void test02()
{
	Person<> p("王大锤",18);
}

//当类模板做函数参数时需要直接指定类型传入或者使用默认参数
//或者将参数模板化或者将类模板化(相当于函数模板和类模板配合使用,一般来说都是用第一种方法)
void test03(Person<>&p)
{

}

//当类模板做父类继承时必须指定父类的数据类型
class Person1 :public Person<string,int>
{

};
//如果想灵活推导类型需把子类也定义成类模板
template<typename T1, typename T2, typename T3>
class Person2 :public Person<T1,T2>
{
	T3 num;
};

//模板类的成员函数类外实现,相对普通类的类外实现得在作用域前面加上模板的参数列表
template<typename T1>
class Person3
{
public:
	Person3(T1);
	T1 m_name;
};
template<typename T1>			//模板声明
Person3<T1>::Person3(T1 name)	//类名<模板参数列表>::类名(参数)
{
	m_name = name;
}

//当类模板分文件编写时,由于是在调用时创建,所以会导致链接不到
//解决方法:直接包含cpp文件或者把将声明和实现写在同一个文件内并把文件后缀改成.hpp

//在类模板中友元函数如果不是特殊要求就尽量在类内实现,因为在类外实现需要提前让编译器知道有这样一个函数和类比较麻烦

int main()
{


	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值