c++模板初阶

1. 泛型编程

 泛型编程是一种编程范式,它允许程序员在编写代码时定义算法和数据结构时可以处理不同类型的数据,而不必为每种数据类型编写特定的代码。泛型编程的主要目的是提高代码的复用性、灵活性和可维护性。以下是一些关于泛型编程的基本概念:

泛型的优点

  1. 代码复用:同一套代码可以用于不同的数据类型。
  2. 类型安全:在编译时就能检查出错误,而不是在运行时。
  3. 性能:由于不需要进行类型转换,可以生成更高效的代码。

泛型编程的例子

  • C++中的模板:C++通过模板支持泛型编程。例如,可以创建一个通用的排序函数,它可以对任何类型的数组进行排序。

template 
void sortArray(T arr[], int size) {
  // 排序逻辑
}

泛型编程与面向对象编程的关系

泛型编程与面向对象编程(OOP)是两种不同的编程范式。OOP侧重于数据和行为的封装,而泛型编程侧重于算法的通用性和效率。在实际应用中,泛型编程常常与OOP结合使用,例如在Java中,泛型类通常也是面向对象的。

泛型编程在现代软件开发中扮演着重要的角色,它有助于构建更加模块化、灵活和高效的软件系统。

 

2. 函数模板

 

函数模板是C++语言中实现泛型编程的一种机制。它允许你编写一个函数,该函数可以处理多种不同类型的参数,而不需要为每种类型重写函数体。当你调用一个模板函数时,编译器会根据传递给函数的参数类型自动生成函数的特定实例。

定义函数模板

函数模板的定义以关键字 template 开始,后跟一个模板参数列表,该列表用尖括号 <> 括起来。模板参数列表可以包含一个或多个模板参数。

template 
T max(T a, T b) {
    return (a > b) ? a : b;
}

 使用函数模板

当你调用一个模板函数时,编译器会自动推断出模板参数的类型。

int i = 5, j = 6;
double x = 3.14, y = 2.71;

int maxInt = max(i, j);    // 调用 max
double maxDouble = max(x, y); // 调用 max

 显式指定模板参数

在某些情况下,编译器可能无法正确推断模板参数的类型,或者你可能想要显式指定模板参数。这时,你可以像下面这样调用函数模板:

int maxInt = max(i, j);

 多个模板参数

函数模板可以有多个模板参数。

template 
T1 add(T1 a, T2 b) {
    return a + static_cast(b);
}

 非类型模板参数

除了类型参数外,C++还允许非类型模板参数,这些参数可以是整型、枚举类型、指针或引用等。

template 
T sumArray(T arr[], int n) {
    T sum = 0;
    for (int i = 0; i < n; ++i) {
        sum += arr[i];
    }
    return sum;
}

函数模板是C++中非常强大的特性,它极大地提高了代码的复用性和灵活性。通过使用模板,可以写出更加通用和高效的代码。 

3. 类模板 

类模板是C++中用于创建泛型类的一种机制,它允许程序员定义一个可以用于任何数据类型的类。与函数模板类似,类模板的定义也以关键字 template 开始,后跟一个模板参数列表。类模板可以包含成员函数和成员变量,这些成员可以操作模板参数所指定的类型。

 

定义类模板:

类模板的定义以 template 关键字开始,后跟模板参数列表,然后是类的定义。

template 
class Array {
private:
    T* elements;
    int size;

public:
    Array(int newSize) : size(newSize) {
        elements = new T[size];
    }

    ~Array() {
        delete[] elements;
    }

    T& operator[](int index) {
        return elements[index];
    }

    int getSize() const {
        return size;
    }
};

 

使用类模板

 当你创建一个类模板的实例时,你需要指定模板参数。

Array intArray(10);  // 创建一个整数数组
Array doubleArray(10);  // 创建一个双精度浮点数数组

类模板的成员函数

类模板的成员函数通常在类模板的定义内部声明,但可以在类模板定义的外部进行定义。

template 
class Stack {
private:
    T* elements;
    int capacity;
    int topIndex;

public:
    Stack(int size);
    ~Stack();
    void push(const T& element);
    T pop();
    bool isEmpty() const;
};

template 
Stack::Stack(int size) : capacity(size), topIndex(-1) {
    elements = new T[capacity];
}

template 
Stack::~Stack() {
    delete[] elements;
}

template 
void Stack::push(const T& element) {
    if (topIndex < capacity - 1) {
        elements[++topIndex] = element;
    }
}

template 
T Stack::pop() {
    if (topIndex >= 0) {
        return elements[topIndex--];
    }
    throw std::out_of_range("Stack is empty");
}

template 
bool Stack::isEmpty() const {
    return topIndex == -1;
}

 非类型模板参数

类模板也可以使用非类型模板参数,这些参数可以是整型、枚举类型、指针或引用等。

template 
class FixedArray {
    T elements[size];
public:
    T& operator[](int index) {
        return elements[index];
    }
    int getSize() const {
        return size;
    }
};

 类模板是C++中实现数据结构和算法泛型化的强大工具,它们使得代码更加通用和可重用。

你可能感兴趣的:(c++,开发语言)