类模板

类模板基本语法

与函数模板基本一致

template<class T1,class T2>
class Person {
public:
	T1 name;
	T2 age;

};

类模板与函数模板的区别

  • 1.类模板没有自动类型推导 在这里插入图片描述
    报错
    在这里插入图片描述
    正确
  • 2.类模板在模板参数列表中可以有默认参数
#include<iostream>
#include<cstdarg>
using namespace std;

template<class T1=string,class T2=int>//看这里
class Person {
public:
	T1 name;
	T2 age;

};
int main() {
	Person< > person;
	person.age = 8;
	person.name = "小王";
}

类模板中成员函数的创建时机

  • 普通函数在实例化时创建函数

  • 类模板在调用时创建函数

类模板做函数参数

请主要看下面的 test() 函数

1.传入指定类型(常用)

template<class T1,class T2>
class Person {
public:
	T1 name;
	T2 age;

};

void test(Person<string, int > &p) {//看这里
	cout << p.name << " " << p.age << endl;
}
int main() {
	Person<string,int > person;
	person.age = 80;
	person.name = "小王";
	test(person);
}

2.参数模板化

template<class T1,class T2>
class Person {
public:
	T1 name;
	T2 age;

};
template<class T1, class T2>
void test(Person<T1, T2 > &p) {//看这里
	cout << p.name << " " << p.age << endl;
}
int main() {
	Person<string,int > person;
	person.age = 80;
	person.name = "小王";
	test(person);
}

3.整个类模板化

template<class T1,class T2>
class Person {
public:
	T1 name;
	T2 age;

};
template<class T>
void test(T &p) {//看这里
	cout << p.name << " " << p.age << endl;
}
int main() {
	Person<string,int > person;
	person.age = 80;
	person.name = "小王";
	test(person);
}

类模板与继承

  • 1.当子类继承父类的模板是必须要 指出父类中T的类型

重点 class man :public Person<string, int>

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

template<class T1,class T2>
class Person {
public:
	T1 name;
	T2 age;

};

class man :public Person<string, int> {
public:
	void f() {
		cout << "l'm a good man" << endl << "给翻译翻译" <<endl<< "我是个好男儿?" << endl << "翻译翻译"
			<<endl<< "我是一个优秀的人?" << endl << "我叫你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
			<< "这就对了!" << endl;

	}
};

int main() {
		man good;
		good.f();
}

在这里插入图片描述

  • 2.如果要灵活指出子类也可变成类模板
 ..
 ..
template<class T1, class T2>
class man :public Person<T1, T2>{
}
..
..

类模板成员函数类外实现

主要看man()函数

template<class T1,class T2>
class Person {
public:
	T1 name;
	T2 age;
	void man();
};
template<class T1, class T2>
void  Person<T1,T2>:: man (){//看这里别忘了<>

		cout << "l'm a good man" << endl << "给翻译翻译" <<endl<< "我是个好男儿?" << endl << "翻译翻译"
			<<endl<< "我是一个优秀的人?" << endl << "我教你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
			<< "这就对了!" << endl;

};

int main() {
	Person<string,int> p;
	p.man();

}

类模板分文件编写

因为类模板中成员函数的实现是在调用时,所以分文件时会导致连接不到成员函数导致出错

解决方法

将类的声明和实现同一个文件中去,并该后缀为.hpp(hpp为约定的名称)

类模板与友元
1.类内实现友元(推荐)

跟平常一样直接使用

template<class T1,class T2>
class Person {
	friend void man(Person<T1, T2> p) {
		cout << "我叫" << p.name << " l'm a good man" << endl << "给翻译翻译" << endl << "我是个好男儿?" << endl << "翻译翻译"
			<< endl << "我是一个优秀的人?" << endl << "我教你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
			<< "这就对了!" << endl;

	};
private:
	T1 name;
	T2 age;
public:
		Person(T1 name, T2 age) {
		this->name = name;
		this->age = age;
	}
	
};

2.类外实现

要声明友元的函数放在类之前, 要声明的全局函数记得要加<>

template<class T1, class T2>
class Person;

template<class T1, class T2>
void man(Person<T1, T2> p) {//要声明友元的函数放在类之前
	cout << "我叫" << p.name << " l'm a good man" << endl << "给翻译翻译" << endl << "我是个好男儿?" << endl << "翻译翻译"
		<< endl << "我是一个优秀的人?" << endl << "我教你翻译翻译什么是他妈的good man!" << endl << "听老婆的话" << endl
		<< "这就对了!" << endl;

};

template<class T1,class T2>
class Person {
	friend void  man<>(Person<T1, T2> p);//要声明的全局函数记得要加<>
private:
	T1 name;
	T2 age;
public:
		Person(T1 name, T2 age) {
		this->name = name;
		this->age = age;
	}
	
};


int main() {
	Person<string, int> p("王铁柱",28);
	man(p);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章