c++基础语法3——模板

c++基础语法3——模板,第1张

c++基础语法3——模板

文章目录

前言一、函数模板

1.函数模板基本语法2.函数模板注意事项3.普通函数与函数模板4.模板局限性 二、类模板

1.类模板语法2.类模板和函数模板区别3.类模板成员函数创建时机4.类模板对象做函数参数5.类模板与继承6.类模板成员函数类外实现


前言

概念:建立通用的模板,提高复用性。在生活中有很多这样的模板,比如ppt模板,简历模板。c++除了面向对象之外还有一种编程思想叫泛型编程,主要用到模板。c++提供的两种模板机制分别为函数模板和类模板

一、函数模板 1.函数模板基本语法
//template----声明模板
//typename ---- 表明其后符号是一个数据类型,可用class替换
//T ---- 通用数据类型
template
void mySwap(T &a,T &b)
{
	T temp = a;
	a = b;
	b =temp;
}
void test()
{
	float a = 10.0;
	float b = 11.0;
	mySwap(a,b); //使用方式1.自动类型推导
	mySwap(a,b); //2.显式指定类型
}

实质:类型参数化

2.函数模板注意事项

1.需要推出一致的数据类型。
2.模板必须要确定T的数据类型才可以使用(当无参时,需要这样做func<数据类型>())。

3.普通函数与函数模板

1.区别
普通函数传参发生隐式类型转换
函数模板调用时如果是自动推导不会发生类型转换,若显式指定则会发生。

2.调用规则
①如果函数模板和普通函数都可以调用,优先调用普通函数
②通过空模板参数类型(<>)可强制调用函数模板
③函数模板可重载
④如果函数模板可以产生更好匹配,优先调用函数模板

4.模板局限性
template
void test(T a, T b)
{
	a = b;
}
//若a和b是数组,赋值 *** 作无法实现

template
bool test2(T a,T b)
{
	if(a>b)
}
//若T是一个Person类,且该class内无关系运算符重载,也无法正确运行

解决办法

//重载一个,此时传Person参数时会匹配这个函数
template<> bool test2(Person &a,Person &b)
{

}
二、类模板 1.类模板语法

作用:建立一个通用类,类中成员数据类型可不具体指定,用一个虚拟的类型代表。

语法:

template
class ...

例子

template
class Person
{
public:
	Person(NameType name,AgeType age)
	{
		this->name = name;
		this->age = age;
	}
	NameType name;
	AgeType age; 
};

void test()
{
	Person p1("Tom",10);
}
2.类模板和函数模板区别

1.类模板没有自动类型推导
2.类模板在模板参数列表中可以有默认参数

template
class Person
{
public:
	Person(NameType name,AgeType age)
	{
		this->name = name;
		this->age = age;
	}
	NameType name;
	AgeType age; 
};

//1.类模板没有自动类型推导
void test1()
{
	Person p("Tom",100); //报错
}

//2.类模板在模板参数列表中可以有默认参数
//template
//这时实例化时可以不指定int
3.类模板成员函数创建时机

普通类成员函数一开始就创建
类模板成员函数调用时创建
原因是编译时不知道具体的数据类型是什么,只有在动态运行时才能知道

4.类模板对象做函数参数
template
class Person
{
public:
	Person(NameType name,AgeType age)
	{
		this->name = name;
		this->age = age;
	}
	NameType name;
	AgeType age; 
};
//1.指定传入类型(最常用)
void print(Person&p)
//2.参数模板化
template
void print2(Person&p)
//3.整个类模板化
template
void print2(T &p)
5.类模板与继承

当子类继承的父类是一个类模板时,必须指定父类中T的数据类型,否则编译器无法给子类分配内存。
如果想灵活指定父类T,子类也必须成为类模板

template
class base
{
public:
	T m;
};

// class Son :public base 此时错误
{

};
class Son :public base //正确,但此时只能是int
{

}

//如果想灵活指定父类T,子类也必须成为类模板
template
class Son2: public base//T2关联父类的数据类型
{
public:
	T1 obj;
}
6.类模板成员函数类外实现
template
class Person
{
public:
	Person(NameType name,AgeType age);
	
	NameType name;
	AgeType age; 
};

template
Person::Person(NameType name,AgeType age)
{
	this->name = name;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存