C++——类模版

  1.类模版语法

类模版作用
     *建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟函数类型来代表.
      语法:
       template<typename T>
       类
     解释:template -- 声明创建模版
          typename -- 表面其后面的符号是一种数据类型,可以用class代替
          T -- 通用的数据类型,名称可以替换,通常为大写字母

//类模版
template<class NameType,class AgeType>
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	void showPerson()
	{
		cout << "name:" << this->m_Name << "age:" << this->m_Age << endl;
	}

	NameType m_Name;
	AgeType m_Age;
};

void test01()
{
	Person<string, int> p1("孙悟空", 999);
}

   2.类模版与函数模版区别

类模版与函数模版的区别主要有两点:
       1.类模版没有自动类型推导的使用方式
       2.类模版在模版参数列表中可以有默认参数

//类模版与函数模版区别
template<class NameType,class AgeType = int>//默认情况下告诉编译器是个整型
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	void showPerson()
	{
		cout << "name: " << this->m_Name << "age=" << this->m_Age << endl;
	}

	NameType m_Name;
	AgeType m_Age;
};

//1.类模版没有自动类型推导使用方式
void test01()
{
	//Person p("孙悟空",1000);//错误,无法用自动类型推导
	
	Person<string,int> p("孙悟空", 1000);//正确,只能用显示指定类型

	p.showPerson();

 }
//2.类模版在模版参数列表中可以有默认方式参数
void test02()
{
	Person<string>p("猪八戒", 999);

}

 3.类模版中成员函数创建时机

*类模版中的成员函数在调用时才创建

   4.类模版对象做函数参数

 学习目标:
      *类模版实例化出的对象,向函数传参的方式
      
     一共有三种传入方式:
      1.指定传入的类型 -- 直接显示对象的数据类型
      2.参数模版化 -- 将对象的参数变为模版进行传递
      3.整个类模版化 -- 将这个对象类型模版进行传递

//类模版对象做函数参数

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;
	}

	T1 m_Name;
	T2 m_Age;
};

//1.指定传入类型
void printPerson1(Person<string, int>& p)
{
	p.showPerson();//类模版的对象做函数中的参数
}

void test01()
{
	Person<string, int>p("孙悟空", 100);
/*这时不是通过p - 这个孙悟空去直接调这个showPerson,
	而是把他传到一个函数中,让他作为实参,在函数体内部中去调用这个成员函数*/
}


//2.参数板化
template<class T1,class T2>
void printPerson2(Person<T1, T2>& p)
{
	p.showPerson();
	cout << "T1的类型为: " << typeid(T1).name * () << endl;
	cout << "T2的类型为: " << typeid(T2).name * () << endl;
}

void test02()
{
	Person<string, int>p("猪八戒", 90);
}

//3.整个类模版化
template<class T>
void printPerson3(T& p)
{
	p.showPerson();
}

void test03()
{
	Person<string, int>p("唐僧", 30);
	printPerson3(p); 
}

    5.类模版与继承 

当类模版碰到继承时,需要注意一下几点:
      *当子类继承的父类是一个模版时,子类在声明的时候,要指定出父类中T的类型
      * 如果不指定,编译器无法给子类分配内存
      * 如果想灵活指定出父类中T类型,子类也需要变为类模版

//类模版与继承
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>
{
	T1 obj;
};

void test02()
{
	Son2<int, char>S2;
}
仅个人看视频笔记与理解,如有误可指出谢谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值