類模板

類模板基本語法

與函數模板基本一致

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);

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