C++ 面向对象程序设计之模板 案例详细解析

目录

一:函数重载(静态绑定)

二:宏定义(不检查数据类型)

三:模板

四:通过类模板实例化一个类

五:模板(创建一条链表)

六:链表实际应用

七:一般类派生类模板

八:从类模板派生出类模板

九:普通类D 继承 类模板TestA


一:函数重载(静态绑定)

编译时就知道运行哪个函数 

#include<iostream>
using namespace std;

int maxNum(int a,int b)           //int_maxNum_int_int
{
	cout<<"demo1"<<endl;
	return a>b?a:b;//三目运算符
}

double maxNum(double a,double b)  //double_maxNum_double_double
{
	cout<<"demo2"<<endl;
	return a>b?a:b;//三目运算符
}

int maxNum(double a,int b)
{
	cout<<"demo3"<<endl;
	return a>b?a:b;//三目运算符
}

int main()
{
	//编译时已经确定调用的函数 静态绑定
	cout<<"max:"<<maxNum(10,20)<<endl;
	cout<<"max:"<<maxNum(10.5,2.3)<<endl;
	cout<<"max:"<<maxNum(10.5,2)<<endl;
    //demo1
    //max:20
    //demo2
    //max:10.5
    //demo3
    //max:10
	return 0;
}

二:宏定义(不检查数据类型)

代码示例如下 

#include<iostream>
using namespace std;
#define MAX(a,b)((a)>(b)?(a):(b))  //宏定义 不检查数据类型

int main()
{
	cout<<"max:"<<MAX(2,3)<<endl;//max:3
    cout<<"max:"<<MAX(2,5.8)<<endl;//max:5.8
    cout<<"max:"<<MAX('a',10)<<endl;//max:97
	return 0;
}

小结:

  1. 函数重载 检查变量类型 根据实际参数类型写很多个函数
  2. 宏定义 求最大值 不检查数据类型
  3. 模板 解决以上缺陷

三:模板

a.模板(一种数据类型T):

#include<iostream>
using namespace std;

template<typename T>  //typename或class都可以  T数据类型
T Max(T a,T b)
{
	return a>b?a:b;
}

int main()
{
	//函数模板的使用 Max<具体数据类型>(实参);
	cout<<"max:"<<Max<int>(10,20)<<endl;//max:20
	return 0;
}

b. 模板(两种数据类型T T1):

#include<iostream>
using namespace std;

template<typename T,typename T1>  //T T1两种不同的数据类型
void SWAP(T &a,T1 &b)
{
	T tmp;
	tmp = a;
	a = T(b);
	b = T1(tmp);
}

int main()
{
	int q=10;
	double m = 2.3;
	SWAP<int,double>(q,m);
	cout<<"m=:"<<m<<endl;
	cout<<"q=:"<<q<<endl;
//	m=:10
//  q=:2
	return 0;
}

小结:

1. 函数模板是函数吗?答:不是函数

2. 格式:template<typename/class 参数名>

              函数类型    函数名  (形参列表) {函数体}

3. 使用的格式:函数名<实际的数据类型>(实参);

4. 使用的时候编译器会用真正的数据类型来代替函数模板中的参数类型

四:通过类模板实例化一个类

通过类模板实例化一个类 再通过具体类实例化一个对象,示例如下

Test.h:

#ifndef TEST_H
#define TEST_H

//类模板声明头文件中 类模板每个成员函数都是函数模板,实现也是在头文件中
template<class T,class T1>  //2种类型数据成员
class TestA
{
public:
	TestA();
	TestA(T a,T1 b);
	T getA();
	T1 getB();
private:
	T a;
	T1 b;
};

template<class T,class T1>//TestA<T,T1>--类名
TestA<T,T1>::TestA( )
{
	this->a = 0;
	this->b = 0;
}

template<class T,class T1>
TestA<T,T1>::TestA(T a,T1 b)
{
	this->a = a;
	this->b = b;
}

template<class T,class T1>
T TestA<T,T1>::getA()
{
	return this->a;
}

template<class T,class T1>
T1 TestA<T,T1>::getB()
{
	return this->b;
}

#endif

main.cpp:

#include<iostream>
using namespace std;
#include"Test.h"

int main()
{
    //业务逻辑相同 数据类型不同
	//通过类模板实例化一个类 在通过具体类实例化一个对象
	TestA<int,double>test1(100,80.5);
	cout<<"a="<<test1.getA()<<endl;
	cout<<"b="<<test1.getB()<<endl;
//	a=100
//  b=80.5
	return 0;
}

五:模板(创建一条链表)

代码示例如下 

CList.h:

#ifndef CLIST_H
#define CLIST_H

template<class T>//链表的节点模板
class CNode      //类名CNode<T>
{
public:
	CNode();
	~CNode();
	T data;           // 数据域 
	CNode<T> *pnext;  //指针域
};

template<class T>
CNode<T>::CNode()
{
	this->data = 0;
	this->pnext = NULL;
}

template<class T>
CNode<T>::~CNode()
{
}

template<class T>
class CList                  //链表类 类名CList<T>
{
public:
	CList();
	~CList();
	void push_back(T data);  //尾部添加节点
	int getListCount();      //获取节点个数
private:
	CNode<T>* head;          //链表头
	int count;               //节点个数
};

template<class T>
CList<T>::CList()            //创建头节点
{
	this->head = new CNode<T>;
	this->count = 0;
}

template<class T>
CList<T>::~CList()  
{
}

template<class T>
void CList<T>::push_back(T data)
{
	CNode<T>* tmp = this->head;
	while(tmp->pnext!=NULL)
	{
		tmp = tmp->pnext;
	}
	CNode<T>* newNode = new CNode<T>;
	tmp->pnext = newNode;
	newNode->data = data;
	++(this->count);
}

template<class T>
int CList<T>::getListCount()
{
	return this->count;
}

#endif

main.cpp:

#include<iostream>
using namespace std;
#include"Test.h"
#include"CList.h"

int main()
{
//创建一条(int数据类型的)数字链表
	CList<int>* head = new CList<int>;
	head->push_back(1);
	head->push_back(2);
	head->push_back(3);
	cout<<head->getListCount()<<endl;//3
	return 0;
}

六:链表实际应用

利用上面的链表模板【创建员工链表】;示例如下

CStaff.h:

#ifndef CSTAFF_H
#define CSTAFF_H
#define ADMIN 1
#define MANAGER 2
#define WAITER 3

class Staff
{
public:
	Staff();
	Staff(int id,char *name,char *pwd,int prole);
	~Staff();
private:
	int ID;
	char name[20];
	char pwd[20];
	int role;
};
#endif

CStaff.cpp:

#include"CStaff.h"
#include<iostream>
using namespace std;

Staff::Staff()
{
}

Staff::Staff(int id,char *name,char *pwd,int prole)
{
	this->ID = id;
	strcpy(this->name,name);
	strcpy(this->pwd,pwd);
	this->role = prole;
}

Staff::~Staff()
{
}

main.cpp:

#include<iostream>
using namespace std;
#include"Test.h"
#include"CList.h"
#include"CStaff.h"

int main()
{
    //创建一条员工链表
	CList<Staff *> *staffList = new CList<Staff *>;
	staffList->push_back(new Staff(1001,"admin","123456",ADMIN));
	staffList->push_back(new Staff(1002,"manager","123456",MANAGER));
	cout<<staffList->getListCount()<<endl;//2
	return 0;
}

小结:

类模板:不是类

格式:  template<class/typename 参数名> 

             class  类名{ };

类的成员函数全部都是函数模板

使用:  创建对象:类名<真正的数据类型>对象;

             对象. + 函数名

七:一般类派生类模板

#ifndef TEST_H
#define TEST_H

//类模板声明头文件中 类模板每个成员函数都是函数模板 实现也是头文件中
// 一般类派生类模板
class A
{
public:
	A(){this->z = 0;}
	A(int z){this->z = z;}
protected:
	int z;
};

template <typename T,typename T1>
class TestA;public A               //类模板 继承一般类A
{
public:
	TestA();
	TestA(T a,T1 b,int z);
private:
	T a;
	T1 b;
};

template <typename T,typename T1>  //类模板所有成员函数也是模板函数
TestA<T,T1>::TestA():A()
{
	this->a = 10;
	this->b =10;
}

template <typename T,typename T1>
TestA<T,T1>::TestA(T a,T1 b, int z):A(z)
{
	this->a = a;
	this->b = b;
}

八:从类模板派生出类模板

#ifndef TEST_H
#define TEST_H

//从类模板中派生出类模板
//类模板定义  模板的实现在头文件中
template <typename T,typename T1>
class Test
{
	public:
		Test(void);
		~Test();
		Test(T a,T1 b);
		T getX();
		T1 getY();
	private:
		T x;
		T1 y;
};
//---------------基类模板实现---------------
//每个函数都是模板
template <typename T,typename T1>
Test<T,T1>::Test(T a,T1 b)
{
	this->x= a;
	this->y= b;
}

template <typename T,typename T1>
Test<T,T1>::Test(void)
{
}

template <typename T,typename T1>
Test<T,T1>::~Test(void)
{
}

template <typename T,typename T1>
T Test<T,T1>::getX
{
	return this->x;
}

template <typename T,typename T1>
T1 Test<T,T1>::getY
{
	return this->y;
}

//派生类模板定义
template <typename T,typename T1>
class TestB:public Test<T,T1>      //继承Test
{
	public:
		TestB(void);
		~TestB();
		TestB(T a,T1 b,T c);
		T getZ();
	private:
		T z;
};

template <typename T,typename T1>
TestB<T,T1>::TestB(T a,T1 b,T c):Test(a,b)
{
	this->z =c;
}

template <typename T,typename T1>
TestB<T,T1>::TestB(void)
{
}

template <typename T,typename T1>
TestB<T,T1>::~TestB(void)
{
}

template <typename T,typename T1>
T TestB<T,T1>::getZ()
{
	return this->z;
}

#endif

九:普通类D 继承 类模板TestA

#ifndef TEST_H
#define TEST_H

//普通类 D继承类模板
class D:public TestA<int , float>
{
public:
	D(){this->d = 0;}
	D(int a,float b,int z,int d);
protected:
	int d;
private:
};

template <int , float>
D::D(int a,float b ,int z,int d):TestA(a,b,z)
{
	this->d =d;
}
#endif
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 面向对象程序设计习题库是一个用于学习和练习面向对象程序设计的资源库。它通常包含一系列习题,每个习题都涉及到了面向对象程序设计的相关概念和技术。通过完成这些习题,学习者可以加深对面向对象程序设计的理解,并提升自己的编程能力。 在习题库中,习题通常会包括问题描述、要求和示例代码。学习者需要根据问题描述,设计和实现符合要求的面向对象程序。在解决问题的过程中,学习者需要运用面向对象程序设计的原则和方法,如封装、继承、多态等。完成习题后,学习者可以通过对比自己的解答和示例代码,进行自我评估和反思,进一步提高自己的编程水平。 面向对象程序设计习题库的好处是多方面的。首先,它提供了一个系统的学习资源,帮助学习者从理论到实践,逐步掌握面向对象程序设计的基本概念和技巧。其次,习题库的多样性和复杂性有助于学习者在实际问题中培养设计和解决问题的能力。此外,通过独立思考和解决问题的过程,学习者可以提高自己的自学和解决问题的能力,培养创造力和逻辑思维。 总之,面向对象程序设计习题库是一个有助于学习和练习面向对象程序设计的资源库。通过完成习题,学习者可以提升自己的编程水平和解决问题的能力,为未来的面向对象程序设计工作做好准备。 ### 回答2: C 面向对象程序设计习题库是一个专门用于训练和提高C语言面向对象程序设计能力的资源库。该习题库提供了大量的编程题目,旨在帮助学习者通过实践来巩固对C语言面向对象编程的理解和应用。习题库中的题目分布在不同的难度级别,从基础的面向对象概念练习到复杂的项目实践,逐渐提高学习者的编程技能。通过解答这些习题,学习者可以逐步掌握面向对象程序设计中的类、对象、继承、多态等基本概念和技巧,并能将其运用到实际项目中。 C语言是一种面向过程的编程语言,而面向对象程序设计则是一种更高级、更抽象的编程范式,可以更加灵活地设计和组织程序结构。通过习题库的训练,学习者可以在C语言中实现面向对象程序设计思想,提高代码的可读性、可维护性和可复用性。 习题库提供了丰富的案例和示例代码,学习者可以参考其中的实现方法和思路,帮助他们更好地理解和应用面向对象程序设计的思想。此外,习题库还提供了测试用例和答案解析,供学习者自测和对照,及时发现和纠正自己的错误。 总之,C面向对象程序设计习题库是一个有助于学习者提高C语言面向对象编程能力的资源库,通过解答其中的题目,学习者可以巩固对面向对象编程的理解和应用,并能够更好地运用到实际项目中。 ### 回答3: C++面向对象程序设计习题库是一种提供给学习者用于实践和巩固面向对象编程概念的资源。这种习题库包含了一系列与C++编程相关的问题和练习,旨在帮助学习者通过实践来深入了解和掌握面向对象的思想和技术。 习题库中的问题通常涉及到类、对象、继承、多态、封装等方面的概念和技术。通过完成这些问题,学习者可以巩固自己对于这些概念的理解,并且能够通过编写和调试代码来加深对于它们的应用。 C++面向对象程序设计习题库的设计通常会从简单到复杂逐渐升级,以满足不同层次学习者的需求。学习者可以根据自身的水平选择适合自己的习题,并按照要求完成相应的实验或编码练习。 通过使用这种习题库,学习者可以更加深入地理解和应用面向对象编程的思想和技术,提高自己的编程能力和解决问题的能力。同时,习题库的实践性和综合性也能够帮助学习者将抽象的理论知识转化为具体的代码实现,加深对于编程语言的理解和熟练度。 总之,C++面向对象程序设计习题库是一种非常有益的资源,它通过实践和练习帮助学习者巩固和提升自己的面向对象编程能力,是学习C++的重要辅助工具之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenruhan_QAQ_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值