c++函数模板与类模板

1 模板介绍

  • 模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者公式。

2 函数模板

2.1 函数模板的实现

  • 函数模板形式
template <类型形参表>
类型 函数名(形参表){
	函数体
}
  • 类型形参表的形式为:template T1, tempplate T2, …, template Tn或者class T1,class T2,…,class Tn
  • 测试代码
#include <iostream>

template <typename T>
T myAddFunc(T data1, T data2) {
	return data1 + data2;
}

int main() {
	int iSum = myAddFunc(100, 50);
	float fSum = myAddFunc(3.6, 8.8);

	std::cout << "iSum = " << iSum << std::endl;
	std::cout << "fSum = " << fSum << std::endl;
	return 0;
}
  • 执行结果
iSum = 150
fSum = 12.4

2.2 函数模板实现原理

  • 当我们调用一个函数模板时,编译器通常用函数实参来为我们推断模板实参。即当我们调用myAddFunc时,编译器使用实参的类型来确定绑定到模板参数T的类型。
  • 例如我们调用myAddFunc(100, 50)时,实参类型为int,编译器会推断出模板实参为int,并将它绑定到模板参数T
  • 编译器用推断出的模板参数来为我们实例化一个特定版本的函数。

2.3 函数模板重载

  • 函数模板可以像普通函数一样重载
  • 测试程序
#include <iostream>

template <typename T>
T myAddFunc(T data1, T data2) {
	return data1 + data2;
}

template <typename T>
T myAddFunc(T data1, T data2, T data3) {
	return data1 + data2 + data3;
}

int main() {
	int sum1 = myAddFunc(10, 20);
	int sum2 = myAddFunc(10, 20, 30);

	std::cout << "sum1 = " << sum1 << std::endl;
	std::cout << "sum2 = " << sum2 << std::endl;
	return 0;
}

3 类模板

  • 类模板实际上是函数模板的推广。类模板用于实现所需数据的类型参数化

3.1 类模板的声明与定义

template <类型形参表>
class 类名{
	//类成员
};

template <类型形参表>
返回类型 类型<类型名>::成员函数1(形参表){
	//函数体
}

template <类型形参表>
返回类型 类型<类型名>::成员函数n(形参表){
	//函数体
}
  • 模板类声明与定义
template <typename T>

class MyArray
{
public:
	MyArray(int size);
	~MyArray();

	T& get(int index);
	void set(int index, T value);

private:
	int mSize;
	T *mData;
};

template <typename T>
void MyArray<T>::set(int index, T value) {
	mData[index] = value;
}

template <typename T>
MyArray<T>::MyArray(int size)
{
	mSize = (size > 1) ? size : 1;
	mData = new T[mSize];
}

template <typename T>
MyArray<T>::~MyArray()
{
	delete[]mData;
}

template <typename T>
T& MyArray<T>::get(int index) {
	return mData[index];
}
  • 这里要注意下,类模板的定义和实现都要放在头文件中。
  • 调用
#include <iostream>
#include "MyArray.h"

int main() {
	MyArray<int> intArray(10);

	intArray.set(0, 12);
	intArray.set(1, 24);
	intArray.set(2, 34);
	intArray.set(3, 55);

	std::cout << "intArray[0] = " << intArray.get(0) << std::endl;
	std::cout << "intArray[1] = " << intArray.get(1) << std::endl;
	std::cout << "intArray[2] = " << intArray.get(2) << std::endl;
	std::cout << "intArray[3] = " << intArray.get(3) << std::endl;

	MyArray<float> floatArray(10);
	floatArray.set(0, 1.1);
	floatArray.set(1, 19.5);
	floatArray.set(2, 20.0);
	floatArray.set(3, 8.8);

	std::cout << "floatArray[0] = " << floatArray.get(0) << std::endl;
	std::cout << "floatArray[1] = " << floatArray.get(1) << std::endl;
	std::cout << "floatArray[2] = " << floatArray.get(2) << std::endl;
	std::cout << "floatArray[3] = " << floatArray.get(3) << std::endl;

	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大草原的小灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值