【每日C/C++问题】

时间:2024-11-09 16:59:32

一、如何使用函数模板和类模板?

函数模板语法:

template<typename T>
函数声明或定义

解释:

template --- 声明创建模板

typename --- 表面其后面的符号是一种数据类型,可以用class代替

T  ---  通用的数据类型,名称可以替换,通常为大写字母

#include<iostream>
using namespace std;

// 函数模板 ,交换两个数
template<typename T> //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
void mySwap(T &a, T &b) 
{
    T temp = a;
    a = b;
    b = temp;

}
int main(){
    int a = 10;
    int b = 20;

    // 利用函数模板交换
    // 两种方式使用函数模板
    // 1、自动类型推导
    // mySwap(a, b);
    // 2、显示指定类型
    mySwap<int>(a, b);
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    return 0;
}

输出

20
10

        可以通过两种方法进行调用,自动类型推导(不会发生隐式类型转换)显示指定类型(可以发生隐式类型转换)

类模板语法:

template<typename T>
函数声明或定义

解释:

template --- 声明创建模板

typename --- 表面其后面的符号是一种数据类型,可以用class代替

T  ---  通用的数据类型,名称可以替换,通常为大写字母

#include<iostream>
using namespace std;
#include<string>
// 类模板
template<class NameType, class AgeType> //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->mName = name;
		this->mAge = age;
	}
	void showPerson()
	{
		cout << "name: " << this->mName << " age: " << this->mAge;
	}
	NameType mName;;
	AgeType mAge;
};

void test01()
{
	// 指定NameType 为 string 类型,AgeType 为 int 类型
	Person<string, int>p1 ("孙悟空", 999);
	p1.showPerson();
}
int main() {
	test01();
	return 0;
}

输出

name: 孙悟空 age: 999

        类模板和函数模板语法相似,在声明模板 template 后面加类,此类称为类模板,在创建对象时指定具体的模板参数类型

二、模板的优点是什么?

  1. 模板复用代码,提高代码的可重用性,把实例化具体类型的工作交给编译器,节省资源,更快的迭代开发。
  2. 增强了代码的灵活性。
  3. 函数模板方式克服了C语言解决类似问题时使用大量不同函数名表示相关功能,克服了C++函数重载用相应函数名字重载几个函数的繁琐

  4. 克服了宏定义不能进行参数类型检查的弊端。