c++-類模板

模板類類內部實現

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
template<class T>//template<typename T>
class Person{
public:
	Person(T name){
		this->name = name;
	}
	void show(){
		cout<<this->name<<endl;
	}
private:
	T name;

};
int main(){
	Person<string> p1("tom");
	p1.show();
	system("pause");
}

模板類類外部實現

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
template<class T>//template<typename T>
class Person{
public:
	Person(T name){
		this->name = name;
	}
	void show();
private:
	T name;

};
template<class T>//template<typename T>
void Person<T>::show(){
		cout<<this->name<<endl;
	}
int main(){
	Person<string> p1("tom");
	p1.show();
	system("pause");
}

模板類操作符重載

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
template<class T> class Person;//template<typename T>//普通友元這樣寫 linxwin通用
template<class T> void show(Person<T> p1);// 普通友元這樣寫 linxwin通用
template<class T>
class Person{
public:
	Person(T name){
		this->name = name;
	}
	//template<class T>//template<typename T> //windows 寫法
	friend ostream& operator<<<T>(ostream& os,Person<T> p1);//liunx win 通用寫法
	//template<class T> windows
	friend void show<T>(Person<T> p1);//前提是必須由上面的兩句
private:
	T name;

};
template<class T>//template<typename T>
ostream& operator<<(ostream& os,Person<T> p1){
		return os << "name" << p1.name << endl;
	}
template<class T>//template<typename T>
void show(Person<T> p1){
	 cout << "name" << p1.name << endl;
}
int main(){
	Person<string> p1("tom");
	cout << p1;
	show(p1);
	system("pause");
}

模板類分文件編寫

  • main.cpp
#include "Person.hpp"
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main(){

	Person<string> p1("tom");
	p1.show();
	system("pause");
}
  • Person.hpp(將模板類聲明和實現寫在一個文件裏)避免由於模板類二次遍歷,各文件獨立編譯導致,文件無法調用模板類成員函數問題
#pragma once
#include <iostream>
#include <string>
using namespace std;
template<class T>
class Person
{
public:
	Person(T name);
	void show();
	~Person(void);
private:
	T name;
};

template<class T>
Person<T>::Person(T name)
{
	this->name = name;
}
template<class T>
void Person<T>::show(){
		cout << this->name << endl;
}
template<class T>
Person<T>::~Person(void)
{
}

不要濫用友元,破壞函數的封裝

類模板與靜態變量

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

template<class T>
class Person{
public:
	static int age;
};
template<class T> int Person<T>::age = 0;
int main(){
	Person<int> a1,a2,a3;//a1 2 3 都是同一個從模板實例化出來的對象的實例化對象,所以共享static
	a1.age = 10;
	cout << a1.age << a2.age << a3.age << endl;
	Person<char> c1,c2,c3;
	c1.age = 20;
	cout << c1.age << c2.age << c3.age << endl;
	system("pause");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章