模板类类内部实现
#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");
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-48591.html