模板類類內部實現
#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");
}
模板類分文件編寫
#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");
}