首页 > 其他分享 >模板——类模板1--与函数的关系

模板——类模板1--与函数的关系

时间:2024-07-16 13:28:26浏览次数:18  
标签:p1 函数 -- age ShowPerson void 模板 name

1.类模板基本语法

template<class T,class T2>

template<class NameType,class AgeType>
class Person
{
public:
	Person(NameType name,AgeType age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	void ShowPerson()
	{
		cout << "姓名:" << this->m_name << "年龄:" << this->m_age << endl;
	}
	NameType m_name;
	AgeType m_age;
};
void test01()
{
	Person<string,int>p1("张三",10);//指定NameType为string,AgeType为int
	p1.ShowPerson();
}

2.类模板与函数模板的区别

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

2.2类模板可以在模板参数列表中设有默认参数

template<class NameType,class AgeType=int>//设置AgeType的类型默认为int
class Person
{
public:
	Person(NameType name,AgeType age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	void ShowPerson()
	{
		cout << "姓名:" << this->m_name << "年龄:" << this->m_age << endl;
	}
	NameType m_name;
	AgeType m_age;
};
void test01()
{
	//Person p1("张三", 10)//错误,类模板没有自动类型推导的使用方式
	Person<string,int>p1("张三",10);//必须使用显示指定类型的方式,指定NameType为string,AgeType为int
	p1.ShowPerson();
}
void test02()
{
	Person<string>p2("李四",15); //类模板可以在模板参数列表中设有默认参数
	p2.ShowPerson();
}

3.类模板中成员函数调用的时机

3.1类模板中的成员函数并不是一开始就创建的,而是在模板调用时再生成

class Person1
{
public:
	void Show_Person1()
	{
		cout << "Show_Person1的调用" << endl;
	}
};
class Person2
{
public:
	void Show_Person2()
	{
		cout << "Show_Person2的调用" << endl;
	}
};
template<class T>
class My_Class
{
public:
	//类模板中的成员函数并不是一开始就创建的,而是在模板调用时再生成
	void func1(){obj.Show_Person1();}
	void func1() { obj.Show_Person1(); }
	T obj;
};
void test01()
{
	My_Class<Person1>p1;
	p1.func1();
	//p1.func2();//编译时才出错,说明函数调用时才会去创建成员函数
}

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

4.1指定传入类型————直接显示对象的数据类型

4.2参数模板化————将对象中的参数变成模板进行传递

4.3整个类模板化————将这个对象类型模板化进行传递

template<class NameType, class AgeType = int>//设置AgeType的类型默认为int
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	void ShowPerson()
	{
		cout << "姓名:" << this->m_name << " 年龄:" << this->m_age << endl;
	}
	NameType m_name;
	AgeType m_age;
};
//指定传入的类型
void Print_Person1(Person<string, int> &p)
{
	p.ShowPerson();
}
void test01()
{
	Person<string, int>p1("张三", 10);
	Print_Person1(p1);
}
//参数模板化

template<class T1,class T2>
void Print_Person2(Person<T1,T2>& p)
{
	p.ShowPerson();
	cout << "T1的类型为" << typeid(T1).name() << endl;
	cout << "T2的类型为" << typeid(T2).name() << endl;
}

void test02()
{
	Person<string, int>p2("李四", 15);
	Print_Person1(p2);
}
//整个类模板化
template<class T>
void Print_Person2(T & p)
{
	p.ShowPerson();
	cout << "T的类型为" << typeid(T).name() << endl;
}
void test03()
{
	Person<string, int>p3("王五", 14);
	Print_Person1(p3);
}

标签:p1,函数,--,age,ShowPerson,void,模板,name
From: https://blog.csdn.net/weixin_74207910/article/details/140441726

相关文章

  • 从零开始建站---网站创建日志(1)
    很早以前突发奇想要不要搭建个网站,因为各种原因一直没有去实现,最近emo的时候发现自己行动力好差,都快大二了总该做点好玩的,所以那就开始搭一个属于自己的小网站吧                     2024/7/15搭建网站分为4步:购买域名,申请服务器,DNS解析、部署网站和备......
  • 组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)
     一、什么是组态软件组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域,用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具,使用户能够创建用户界......
  • 类模板案例——数组类封装(vector<>的逻辑代码)
    .hpp文件#pragma#include<iostream>usingnamespacestd;template<classT>classMy_arry{public: My_arry(intcapacity)//赋初值 { this->m_capacity=capacity;//容量 this->m_Arry_size=0;//大小 this->m_Arry_Addres=newT[capacity];......
  • React+TS前台项目实战(三十)-- 首页构建之基于react-query和性能hook实现全页面数据渲染
    文章目录前言一、效果展示二、首页源码+详细注释说明+技术分析1.页面功能分析2.代码+详细注释总结前言前三篇文章详细介绍了首页的响应式布局,采用关注点分离进行模块拆解,现在只需按需引入模块,页面更加简洁,代码的维护性得到提升。今天将进入首页的收尾阶段,即完成......
  • Windows安装Python超详细教程
    安装Python3(Windows)有的同学问道怎么安装Python。我们今天讲一下在Windows上安装Python。Python有两个大版本,一个是Python2,另外一个是Python3。目前各种代码以及平台都在往Python3迁移,新项目直接采用Python3。对于新学习的朋友来说,可以直接从Python3开始入手。下载Python......
  • vite react Typescript 构建一个移动端网页
    使用Vite、React和TypeScript来构建一个移动端网页是一个高效且现代的开发方式。Vite是一个构建工具和开发服务器,它利用原生ES模块导入来提供快速的冷启动和即时模块热更新(HMR)。React是用于构建用户界面的JavaScript库,而TypeScript是JavaScript的一个超集,它添......
  • Elasticsearch基础(二)
    4.RestAPIES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:ElasticsearchClients|Elastic其中的JavaRestClient又包括两种:JavaLowLevelRestClientJavaHighLevelRestClient学习JavaHighL......
  • C++游戏篇1“很好的游戏,使我手指旋转”(原创)
    话不多说,上代码!#include<bits/stdc++.h>#include<windows.h>usingnamespacestd;intGe,Fen,timp,F,a[22][6];doubleShi,B;voidS(intForgC,intBackC){WORDwColor=((BackC&0x0F)<<4)+(ForgC&0x0F);SetConsoleTextAttribute(GetS......
  • C++转换进制
    前言本蒟蒻:让C++转进制?我都不会转,更何况让C++转。正文转进制,我们要知道36进制的0-35都用什么表示。0-9就是0-9,而10-35分别是ABCDEFG........RSTUVWXYZ。我们可以设一个字符串表示0-35:strings="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";重要的一步来了,参考以下方法,用while......
  • 嵌入式入职上班第一天:读懂保护与解读保护
    摘要:作为一名嵌入式工程师,了解和掌握保护机制至关重要。本文将为大家介绍嵌入式系统中常见的保护机制,帮助新入职的嵌入式工程师快速上手。#正文:##一、引言嵌入式系统在各个领域都有广泛的应用,为了保证系统的稳定性和安全性,各种保护机制应运而生。作为一名嵌入式新入职的......