c++模板与重载

Camill

模板

在C++中,模板(Templates)是一种通用的编程工具,允许编写通用的类或函数,以支持多种数据类型。模板使得编写可重用的代码变得更加容易,并提供了一种在编译时生成特定类型的代码的机制。通过模板,可以编写与数据类型无关的代码,从而提高了代码的灵活性和可重用性。

模板在C++中有两种主要形式:

  1. 类模板(Class Templates):类模板允许定义通用的类,其中的成员函数和成员变量可以是与模板参数无关的通用类型。通过类模板,可以创建多个具有相同行为但不同数据类型的类的实例。
  2. 函数模板(Function Templates):函数模板允许定义通用的函数,其中的参数类型可以是模板参数。通过函数模板,可以实现一种编写一次代码,适用于多种数据类型的函数。

在使用模板时,编译器会根据模板参数的实际类型生成相应的代码,从而实现类型特定的行为。例如,当你使用一个模板类或函数时,你需要提供实际的类型参数,以便编译器能够生成相应的代码。

模板类写法

1
2
3
4
5
6
7
template <class T>
class People
{
public:
People(T _x) : x(_x) {}
T x;
};

模板函数的写法

1
2
3
4
5
template <class T>
T max(const T &a, const T &b)
{
return a > b ? a : b;
}

调用函数模板

1
2
3
4
5
6
int main()
{
std::cout << max(77, 12) << std::endl; // 输出 77
std::cout << max<char>('a', 'z') << std::endl; // 输出 z
return 0;
}

其中max的参数会隐式的指定,例如77和12会隐式指定为int

运算符重载

成员函数重载

这是其中一种写法,声明和定义都写在类里面

1
2
3
4
5
6
7
8
9
10
11
12
template <class T>
class People
{
public:
People(T _x) : x(_x) {}
T x;

People<T> operator+(const People<T>& other)
{
return People<T>(x + other.x);
}
};

这是另一种写法,声明与定义分开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
class People
{
public:
People(T _x) : x(_x) {}
T x;

People<T> operator+(const People<T>& other);
};

template <class T>
People<T> People<T>::operator+(const People<T>& other)
{
return People<T>(x + other.x);
}

全局函数重载

1
2
3
4
5
6
7
8
9
10
11
12
13
template <class T>
class People
{
public:
People(T _x) : x(_x) {}
T x;
};

template <class T>
People<T> operator+(const People<T> &p1, const People<T> &p2)
{
return People<T>(p1.x + p2.x);
}

调用运算符重载

1
2
3
4
5
6
7
int main()
{
People<int> p1(10);
People<int> p2(20);
People<int> p3 = p1 + p2; // 调用模板函数
std::cout << "p3.x = " << p3.x << std::endl;
}

结果是 30

1
2
3
4
5
6
7
8
int main()
{
People<float> p1(0.10);
People<float> p2(0.20);
People<float> p3 = p1 + p2; // 调用模板函数
std::cout << "p3.x = " << p3.x << std::endl;
return 0;
}

结果是 0.3

  • 标题: c++模板与重载
  • 作者: Camill
  • 创建于 : 2024-02-19 16:36:45
  • 更新于 : 2024-02-20 11:56:15
  • 链接: https://camill.love/note/cpp-1/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论