C++中的类模板

一、学习笔记

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

*/

猜你喜欢

转载自www.cnblogs.com/hellokitty2/p/10633234.html