欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类模板基础知识(2)

程序员文章站 2022-03-10 16:23:43
...

知识框图
类模板基础知识(2)

1.类模板与继承

//需要解决的问题:当继承的父类是一个类模板时如何正确调用?
//1.当继承的父类是类模板时,必须指定父类中的类型。
//2.指定方式一:直接指定一个确定数据类型。
//3.指定方式二:将子类也写成类模板,均采用模板方式处理数据类型

#include<iostream>
using namespace std ;
#include<string>
template<class T>
class Father{
public:
	T m1;
};

//class son:public Father{};			//若无指定,会显示Father类缺少参数列表。

//方式一:
class son1:public Father<int>{           //在继承的时候就指定int类型。
public:
	int m2;
};

//方式二:
template<class T1,class T2>				 //在继承之前将子类也进行模板化。
class son2:public Father<T1>{          
public:
	T2 m2;
};

void test(){

	son1 s1;							//不同指定方式对应不同实例化对象方法。
	son2<int,int> s2;		

}

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

2.类模板成员函数的类外实现

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

template<class nametype ,class agetype >
class Person{
public:
	Person(nametype name,agetype age );

	nametype m_name;
	agetype m_age;

	void showname();

	void showage();

};
//类外实现方式
template<class nametype ,class agetype >                        //需声明类模板
Person<nametype,agetype>::Person(nametype name,agetype age){    //在指定作用域下,应写上类模板参数列表即<nametype,agetype>
		this->m_age = age;
		this->m_name = name;
	}

template<class nametype ,class agetype >
void Person<nametype,agetype>::showname(){
		cout<<"姓名:"<<this->m_name<<endl;
	}

template<class nametype ,class agetype >
void Person<nametype,agetype>::showage(){
	cout<<"年龄:"<<this->m_age<<endl;
	}

void test01(){
	Person<string,int> p1("八号程序员",22);
	p1.showname();
	p1.showage();
}


int main () {

	test01();

	system("pause");
		return 0;
}

3.类模板分文件编写

//.hpp下code.
#pragma once
#include<iostream>
using namespace std ;
#include<string>


template<class nametype ,class agetype >
class Person{
public:
	Person(nametype name,agetype age );

	nametype m_name;
	agetype m_age;

	void showname();

	void showage();

};
//类外实现方式
template<class nametype ,class agetype >                        //需声明类模板
Person<nametype,agetype>::Person(nametype name,agetype age){    //在指定作用域下,应写上类模板参数列表即<nametype,agetype>
		this->m_age = age;
		this->m_name = name;
	}

template<class nametype ,class agetype >
void Person<nametype,agetype>::showname(){
		cout<<"姓名:"<<this->m_name<<endl;
	}

template<class nametype ,class agetype >
void Person<nametype,agetype>::showage(){
	cout<<"年龄:"<<this->m_age<<endl;
	}
//在主程序段code。
//常规分文件编写原则:声明留在头文件(.h),实现放在源文件(.cpp)
//类模板因为成员函数创建时机的问题,通常需要将常规的(.h)(.cpp)写到一个文件下,通常记为(.hpp)

#include<iostream>
using namespace std ;
#include<string>
#include"Person.hpp"		//Person.hpp为上述文件的名称。

void test01(){
	Person<string,int> p1("八号程序员",22);
	p1.showname();
	p1.showage();
}


int main () {

	test01();

	system("pause");
		return 0;
}

4.类模板与友元

//全局函数类内实现 - 直接在类内声明友元即可
//全局函数类外实现 - 需要提前让编译器知道全局函数的存在

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

//类外实现全局函数做友元,需提前声明。
//1.提前声明类模板
template<class nametype ,class agetype >class Person;
//2.提前做函数实现
template<class nametype ,class agetype >
void showperson2(Person<nametype,agetype>& p){
	cout<<"类外实现——姓名:"<<p.m_name<<" 年龄:"<<p.m_age<<endl;
	}


template<class nametype ,class agetype >
class Person{
	//类内实现全局函数做友元
	friend void showperson(Person<nametype,agetype>& p){
		cout<<"类内实现——姓名:"<<p.m_name<<" 年龄:"<<p.m_age<<endl;
	}
	//类内声明,类外实现。
	friend void showperson2<>(Person<nametype,agetype>& p);			//注意<>,不要遗漏。

public:
	Person(nametype name,agetype age );

private:
	nametype m_name;
	agetype m_age;
};

template<class nametype ,class agetype >                        //类外实现构造函数
Person<nametype,agetype>::Person(nametype name,agetype age){    //在指定作用域下,应写上类模板参数列表即<nametype,agetype>
		this->m_age = age;
		this->m_name = name;
	}

void test01(){
	Person<string,int> p1("八号程序员",22);
	showperson(p1);
	showperson2(p1);
}

int main () {

	test01();

	system("pause");
		return 0;
}
//推荐:类内实现。
//简单的方法,它不香吗?

本文是根据B站内容:《黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难》:https://www.bilibili.com/video/BV1et411b73Z?p=314 学习整理笔记。

相关标签: c++