C++学习系列(14)——模板(二:类模板)

本文详细介绍了C++中的类模板,包括类模板的语法、与函数模板的区别、成员函数创建时机、作为函数参数的方式、与继承的关系、类外实现以及友元函数的使用。此外,还通过案例探讨了如何实现一个通用的数组类。
摘要由CSDN通过智能技术生成

C++学习系列(14)——(二:类模板)

②:类模板
2.1类模板语法
类模板的作用:

  • 建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表

语法:template<typename/class T,...>

解释:
template - -声明创建模板
typename - - 表面其后面的符号是一种数据类型,可以用class代替
T - - 通用的数据类型,名称可以替换,通常为大写字母

在这里插入图片描述
总结:类模板和函数模板语法相似,在声明模板template后面加类,此类称为类模板。

2.2类模板与函数模板区别

类模板与函数模板区别主要有两点:

  1. 类模板没有自动类型推导的使用方式

在这里插入图片描述

  1. 类模板在模板参数列表中可以有默认参数

在这里插入图片描述在这里插入图片描述

2.3类模板中的成员函数创建时机
类模板中成员函数和普通类中成员函数创建时机是有区别的:

  • 普通类中的成员函数一开始就可以创建
  • 类模板中的成员函数在调用时才创建

在这里插入图片描述

2.4类模板对象做函数参数
学习目标:

  • 类模板实例化的输出对象,向函数传参的方式

一共有三种传入方式:

  1. 指定传入的类型 - - -(常用)直接显示对象的数据类型在这里插入图片描述

  2. 参数模板化 - - -将对象中的参数变为模板进行传递
    在这里插入图片描述

  3. 整个类模板化 - - -将这个对象类型 模板化进行传递
    在这里插入图片描述

2.5类模板与继承

当类模板碰到继承时,需要注意以下几点:

  • 当子类继承的父类是一个类模板时,子类在声明的时候,要指出父类中T的类型
  • 如果不指定,编译器无法给予子类分配内存
  • 如果想灵活指出父类中T的类型,子类也需变为类模板
#include <iostream>
#include<string>
using namespace std;

//类模板与继承

template<class T>
class Base
{
   
	T m;
};

//class Son :public Base  //错误,必须知道父类中T的数据类型,才能继承
class Son:public Base<int>
{
   

};

void test01()
{
   
	Son s1;//实例化对象
}

//如果想灵活指定父类中T类型,子类也需要变为类模板
template<class T1,class T2>
class Son2 :public Base<T2>
{
   
public:
	Son2()
	{
   
		cout << "T1的数据类型为:"<<typeid(T1).name() << endl;
		cout << "T2的数据类型为:"<<typeid(T2).name() << endl;
	}
	T1 obj;
};

void test02()
{
   
	Son2<int, char> S2; 
}

int main()
{
   
	test02();
	system("pause");
	return 0;
}

总结:如果父类是类模板,子类需要指定出父类中的T的数据类型

2.6类模板成员函数类外实现

学习目标:能够掌握类模板中的成员函数类外实现

#include <iostream>
#include<string>
using namespace std;

//类模板成员函数类外实现
template<class T1,class T2>
class Person
{
   
public:
	Person(T1 name, T2 age);//构造函数
	/*{
		this->m_Name = name;
		this->m_age = age;
	}*/

	void showPerson();//成员函数
		/*{
			cout << "姓名:" << this->m_Name << "年龄:" << this->m_Age << endl;
		}*/
public:
	T1 m_Name;
	T2 m_Age;
};


//构造函数的类外实现
template<class T1, class T2>
Person<T1,T2>::Person(T1 name, T2 age)//需要加作用域
{
   
	this->m_Name = name;
	this->m_Age = age;
}

//成员函数类外实现
template<class T1,class T2>
void Person<T1,T2>::showPerson()
{
   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值