2020.12.c++模板

c++模板

一.概念

1.特点

  • 模板不可以直接使用,它只是一个框架
  • 模板的通用并不是万能的

二.函数模板

1.函数模板的作用

  • 建立一个通用函数,其函数值类型和形参类型可以不具体制定,用一个虚拟的类型来代表 ,将类型参数化

2.函数模板的语法和使用

//template---声明创建模板
//typename---表明其后面是一种数据类型,也可以用class代替
template<typename T>//声明一个模板,<typename T>----模板参数表
//以下是函数的声明或定义
  • 实际案例:完成两个相同类型的值的交换

    #include <iostream>
    using namespace std;
    
    template<typename T>
    void mySwap(T& a, T& b) {
    	T temp = a;
    	a = b;
    	b = temp;
    }
    //模板函数的使用
    
    void test02() {
    	int a1 = 1;
    	int b1 = 2;
    	cout << a1 << endl;
    	cout << b1 << endl;
    	mySwap(a1, b1);//自动类型推导
    	//mySwap <int>(a1,b1);显示指定类型
    	cout << a1 << endl;
    	cout << b1 << endl;
    }
    
    int main() {
    	test02();
    }
    /*1
    2
    2
    1*/
    

3.函数模板注意事项

  • 自动类型推导,必须导出一致的数据类型T,才可以使用
  • 模板必须要确认T的数据类型才能使用

4.普通函数和模板函数的区别

  • 普通函数调用可以发生隐式类型转换
  • 函数模板 用自动类型推导,不可以发生隐式类型转换
  • 函数模板 用显示指定类型,可以发生隐式类型转换(比如:两个数字相加得到一个int型,如果其他一个数是char型--->会隐式转换为int型)

5.普通函数和函数模板的调用规则

三.类模板

1.类模板的作用

  • 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表

2.类模板的语法和使用

template<class T>//类模板声明
//底下写类的定义
//<class T>---->模板参数表,不能为空,参数可以有多个,用逗号隔开
    
  • 使用
#include <iostream>
using namespace std;
#include <String>

template<class Nametype,class Agetype>
class Person {
public:
	Person(Nametype name,Agetype age) {
		p_name = name;
		p_age = age;
	}
	void showPerson() {
		cout << p1.p_age << p1.p_name << endl;
	}

	Nametype p_name;
	Agetype p_age;
};

void test03() {
	Person<string, int> p1("aaa", 10);
	p1.showPerson();
}

int main() {
	test03();
}
/*10aaa*/

3.类模板和函数模板的区别

  • 类模板没有自动类型推导的使用方式,只能使用显示类型法。

  • 类模板在模板参数列表中有默认参数

    (比如上面的:template<class Nametype,class Agetype=int>

    ​ 在之后的构造对象后,可以不显示后面Agetype的类型

    ​ Person p2("bbb,20")

    )

4.类模板中成员函数创建时间

  • 类模板中的成员函数,并不是一开始就创建的,而是在模板类调用时(创建模板类的对象),才生成

5.类模板成员函数类外实现

//类模板成员函数类外实现
#include <iostream>
using namespace std;
#include <String>

template<class Nametype, class Agetype>
class Person {
public:
   Person(Nametype name, Agetype age);//只写函数声明
   	/*{p_name = name;
   p_age = age; }*/

   	void showPerson();//只写函数声明,定义在类外实现
   	/*{cout << p_age << p_name << endl;}*/
   

   Nametype p_name;
   Agetype p_age;
};

//构造函数类外实现
//是类模板的类外实现,要加模板的参数列表----模板参数名表
template<class Nametype, class Agetype>
Person<Nametype, Agetype>::Person(Nametype name,Agetype age) {
   p_name = name;
   p_age = age; 
}
//成员函数在类外实现
//是类模板的类外实现,要加模板的参数列表----模板参数名表
template<class Nametype, class Agetype>
void Person<Nametype, Agetype>::showPerson() {
   cout << p_age << p_name << endl;
}

void test04() {
   Person<string, int> p1("aaa", 10);
   p1.showPerson();
}

int main() {
   test04();
}
/*10aaa*/
  • 在类模板外部定义的类模板的成员函数 必须是函数模板
  • 是类模板的类外实现,要加模板的参数名列表----模板参数名表,它实际上是一个模板实例化的类型实参表,不用带class/typename
posted @ 2020-12-09 20:32  维他命D片  阅读(45)  评论(0编辑  收藏  举报