Skip to main content
 首页 » 编程设计

C++中的类模板

2022年07月19日150sxdcgaq8080

一、学习笔记

1.类模板的格式
(1)声明

template<typename T> /* 使用T表示某种类型,比如: */ 
class AAA { 
private: 
    T obj; 
public: 
    void test_func(T& t); 
    ..... 
};

(2)定义

template<typename T> 
void AAA<T>::test_func(T& t)  .... 

注意:函数模板和类模板都是typename, 函数模板中template<typename T1, typename T2> 指定两个变量也是可以的。

2.类模板的使用
(1)可以在实例化对象的时候再实例化类模板,eg:
AAA<int> a;
AAA<double> b;

(2)也可以事先实例化:
template AAA<int>;
再使用:
AAA<int> a;

3.类模板的重载(也称为定制,特例化)
(1)声明

template<> 
class AAA<int> { 
...... 
public: 
    void test(void); 
};

(2)定义

void AAA<int>::test(void) ...

定做的AAA<int>中的内容可以和模板AAA完全不一样!

4.函数参数若为引用,若想传入一个数值,函数参数应该定义为const引用

5.只有在使用类模板定义类的时候才会生成对应的代码

5.C++中的链表操作和容器里面大量使用到了类模板。

6.函数模板和类模板应该放在头文件中,因为其只是编译指令,编译器在编译的时候根据这些指令来生成代码,只有把它放在头文件中才能供更多的文件使用。

二、例子

#include <iostream> 
 
using namespace std; 
 
template<typename T>    //模板类 
class Person { 
    T a; 
public: 
    void set(const T &a); 
    void get() { 
        cout << "Person: a = " << this->a << endl; 
    } 
}; 
 
template<typename T> void Person<T>::set(const T &a) { 
    this->a = a; 
} 
 
 
 
template<> 
class Person<int> {        //这个模板类的一个特例化 
    int a; 
public: 
    void set(const int &a); 
    void get() { 
        cout << "Person<int>: a = " << this->a << endl; 
    } 
}; 
 
void Person<int>::set(const int &a) { 
    this->a = a; 
} 
 
 
int main() { 
    Person<int> p1; 
    p1.set(100); 
    p1.get(); 
 
    Person<double> p2; 
    p2.set(3.14); 
    p2.get(); 
 
    return 0; 
} 
 
/* 
Person<int>: a = 100    优先调用特例化的模板类 
Person: a = 3.14 
 
*/

本文参考链接:https://www.cnblogs.com/hellokitty2/p/10633234.html