類模板基本語法
與函數模板基本一致
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);
}