上一篇文章我们提到了c++结构体模板的经典应用pair模板,发现功能异常强大,想必我们的小伙伴肯定已经为c++模板的奥秘所深深吸引,(哈哈!!假装有人在看,心酸)
讲c++结构体模板之前,现在我们默认我们同学已经对c++函数模板,类模板有所了解了,恩!!还是上图讲一下吧
那c++模板类型主要有3种
1.函数模板
//函数模板---使用体现:调用函数时传递的参数类型。
template<class 数据类型参数标识符> <返回类型><函数名>(参数表) { 函数体 }
2.类模板
//类模板---使用体现:声明类对象时 Stack<类型> s;
template<class T>
class Stack
{
public:
T pop();
bool push(T e);
private:
StackNode<T> *p;
}
template<class T>//类模板外的 成员函数实现
T Stack<T>::pop()
{...}
3.结构体模板
//结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
template<class T>
struct StackNode
{
struct T data;
struct StackNode<T> *next;
};
//示例代码
#include <iostream>
//还是熟悉的struct student
struct student{
int height;
int weigth;
};
template <typename T>
struct Stack{
int top;
int size;
T *data; //将数据类型定义成模板,增强通用性
};
int main()
{
//初始化一个student栈
struct student a;
struct Stack<struct student>;
struct Stack(0,-1,&a); //报错 ----- 原因:下面见分晓
return 0;
}
第二发:
我们发现结构体模板pair<int,int> a(3,4);
而在上述代码中,我们定义
struct Stack(0,-1,&a);
//---- 报错,原因,在c++中,结构体也有构造函数 struct和class没有区别,唯一的区别是,如果没有写public、private等,
//struct缺省是公有成员,class缺省是私有的
所以说下面代码等价
template <typename T>
struct Stack{
int top;
int size;
T *data; //将数据类型定义成模板,增强通用性
Stack(int top, int size)
{
this->top = top;
this->size = size;
}
};
-----------------------------------------分割线----------------------------------------------------------
template <typename T>
struct Stack{
public:
int top;
int size;
T *data; //将数据类型定义成模板,增强通用性
Stack(int top, int size)
{
this->top = top;
this->size = size;
}
};
而且,假如结构体没有自定义构造函数,c++编译器编译时会自动加入一个无参构造函数,
同样的,在结构体里面也可以使用this指针,this指针在结构里面也就代表着本结构体示例的指针(类的this,本类的对象的指针)
所以说struct和class没有区别,唯一的区别是,如果没有写public、private等,struct缺省是公有成员,class缺省是私有的,其他的类型
构造函数,析构函数,拷贝构造函数,继承在结构体也可以同样使用
继承
//以下合法
struct Stack2: public Stack{
};
结果:
#include <iostream>
using namespace std;
//还是熟悉的struct student
struct student{
int height;
int weigth;
};
template <typename T>
struct Stack{
int top;
int size;
T *data; //将数据类型定义成模板,增强通用性
Stack(int top, int size, T *s)
{
this->top = top;
this->size = size;
data = new(T);
memcpy(data,s,sizeof(s));
}
};
int main()
{
//初始化一个student栈
struct student a;
struct Stack<struct student> s(1,2,&a);
cout<<s.size<<" "<<endl;
return 0;
}
之前我们定义pair的时候
pair<int,int>a(3,4);
现如今我们的struct Stack
初始化的时候
struct Stack<struct student> s(1,2,&a);
是不是一样的效果
有的同学说不是,好,再给你来点狠得
typedef struct Stack pair_test;
定义pair_test<struct student>p(1,2,&a);