C++模板(1) - 模板基本概念

目录

 

1.模板定义

2.函数模板(Function Templates)

3.类模板

4.多个模板参数

5.模板参数的默认值

6.函数重载与函数模板的区别

7.模板如何工作

8.模板特化

9.模板元编程


1.模板定义

模板是C++语言中很强大的一个工具。它允许将一个数据类型做为参数进行传递,这样不需要为每个数据类型都写相同的代码。
例如,对不同类型的数据进行排序。与其编写多份重复的代码,不会只写一个sort函数,并将数据类型当作参数传递。

C++中使用两个关键字来支持模板:‘template’'和‘typename’. 第二个关键字也可以使用'class'来替换。

2.函数模板(Function Templates)

可以生成一个对不同类型的数据都通用的函数。

#include <iostream>
using namespace std;

// 支持所有数据类型的函数。即使对于用户自定义类型,只要重载了操作符'>',则也是支持的。
template <typename T>
T myMax(T x, T y) {
    return (x > y) ? x : y;
}

int main() {
    cout << myMax<int>(3, 7) << endl;
    cout << myMax<double>(3.0, 7.0) << endl;
    cout << myMax<char>('g', 'e') << endl;
    return 0;
}

运行结果:
7
7
g

3.类模板

类模板与函数模板类似,类模板也用于支持多种类型数据。
当需要定义LinkedList, BinaryTree, Stack, Queue, Array等时,类模板很有用。
下面是一个模板数组类的例子。

#include <iostream>
using namespace std;

template <typename T>
class Array {
private:
    T* ptr;
    int size;
public:
    Array(T arr[], int s);
    void print();
};

template <typename T>
Array<T>::Array(T arr[], int s) {
    ptr = new T[s];
    size = s;
    for (int i = 0; i < size; i++)
        ptr[i] = arr[i];
}

template <typename T>
void Array<T>::print() {
    for (int i = 0; i < size; i++)
        cout << " " << *(ptr + i);
    cout << endl;
}

int main() {
    int arr[5] = { 1, 2, 3, 4, 5 };
    Array<int> a(arr, 5);
    a.print();
    return 0;
}

运行结果:
1 2 3 4 5

4.多个模板参数

与普通参数一样,可以将多个类型数据做为参数传递给模板。如下面例子所示:

#include<iostream>
using namespace std;

template<typename T, typename U>
class A {
    T x;
    U y;
public:
    A() { cout << "Constructor Called" << endl; }
};

int main() {
    A<char, char> a;
    A<int, double> b;
    return 0;
}

运行结果:
Constructor Called
Constructor Called

5.模板参数的默认值

与普通参数一样,可以指定模板参数的默认值。参考下面例子。

#include<iostream>
using namespace std;

template<typename T, typename U = char>
class A {
public:
    T x;
    U y;
    A() { cout << "Constructor Called" << endl; }
};

int main() {
    A<char> a;  //会调用A<char, char>   
    return 0;
}

运行结果:
Constructor Called

6.函数重载与函数模板的区别

函数重载和模板都是OOP中的多态特性。
函数重载是多个函数做相类似的操作,而模板函数是多个函数做相同的操作。

7.模板如何工作

模板在编译期间会展开,与宏定义类似。
不同之处在于,编译器在展开模板之前会进行类型安全检查。原理很简单,源代码中仅包含模板函数/模板类,但是编译生成的代码中可能包含相同函数/类的多份拷贝。
如果模板函数/模板类中有静态成员,每个模板实例都会包含它自己的静态变量。参考本博客的这篇文章《C++模板(2) - 模板和静态变量》

8.模板特化

模板特化允许对于一个特定类型的数据,有不同的代码实现。参考本博客的这篇文章《C++模板(5) - 模板特化》

9.模板元编程

参考本博客的这篇文章《C++模板(4) - 模板元编程》

Java也支持这些特性,在Java中称为泛型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值