问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++类模板是怎么理解

发布网友 发布时间:2022-04-27 00:05

我来回答

5个回答

热心网友 时间:2022-06-20 22:33

模板类英文为class template,template的中文翻译为模板,所以模板类的意思其实是:类的模板。
顾名思义,模板类是相当于一个模具,当参数给定时,生成具体的类,也叫实例化。它的提出主要是为了减少代码重复。
例如,我们可以用下面的代码交换两个数b和c
a = b;
b = c;
c = a;
这个交换过程与a,b,c的具体类型没有关系,因此我们可以用它来交换两个整数,或者两个浮点数。更一般的,我们可以用来交换两个具有赋值运算符的类型。因此,可以用模板进行一般化:
template<class T>
void swap(T &b, T &c){
a = b;
b = c;
c = a;

}
当然,上面介绍的这个不是模板类,而是模板函数。不过他们的概念是类似的。其中一开始的template代表后面尖括号中的是模板参数(类似于函数的参数),class代表参数是类(相应的,可以用template<int N>来声明整型参数)。后面的代码和的函数基本没有区别,只是用T来代替了具体的类型,例如int,double等。根据需要我们可以用swap<int>(b,c)来交换两个整数,swap<double>(b,c)交换两个浮点数。由于编译器可以根据b,c的具体类型推导T的具体含义,因此可以简写为swap(b,c)。
回到模板类,假设我们需要一个类型来代表动态数组,且该类型支持size成员函数。如果是整型的类,我们可能会写
class vector_int{
size_t size() const;

};
如果某一天,我们又需要浮点类型的动态数组,可能又会写
class vector_double{
size_t size() const;

};
于是就会发现它们的代码是如此的类似,因此我们希望将它一般化。如同swap函数的做法,我们将它定义为模板类:
template<class T>
class vector{
size_t size() const;
};
因此,vec_int等同于vector<int>,而vector_double等同于vector<double>。因为运用模板类的语法类似于
vector<T> a;
因此,编译器没办法为我们推导T的具体含义,所以不能像模板函数一样进行简写。
当然,上面是比较简单的情况,有时候我们需要的类在大多数情况下是一样的,但是对于某几个特殊情形可能不太一样,例如我们可能希望对于bool类型的数组能尽量减少内存的使用,用一个比特位代表一个bool值。从而,我们的数组不是通过bool a[10]的形式来定义。在这种情况下,c++提供了模板特化,也就是说当模板的参数取某个具体的值时,我们使用不同的模板,定义方式如下:
template<>
class vector<bool>{
size_t size() const;
};

热心网友 时间:2022-06-20 22:34

你不要跟着他绕,越绕越头晕,你只要记住这里的T代表一种类型就行了。模版实例化时只是把T用相应的类型替换。
如简单的min模版:
template<class T>
T min(T a, T b){return a<b?a:b;}

实例化:
int x = 100;
int y = 200;
int z = min(x,y); //这里的x、y都为int型,就相当于实例化了一个int型的min模版,你把int代上面T就清楚了

类模版也是一样的
template<class T>//也可用template<typename T>,并且这是最新的C++标准
class C2DPoint //2D点坐标模版
{
public:
C2DPoint(T x=0, T y=0):m_x(x), m_y(y){}

void X(T x){m_x = x;}
void Y(T y){m_y = y;}

T X(void)const{return m_x;}
T Y(void)const{return m_y;}

void Print()const;
private:
T m_x, m_y;
};

template<typename T>
void C2DPoint<T>::Print()const
{
std::cout<<"x:"<<m_x<<" y:"<<m_y<<std::endl;
}
int main()
{
C2DPoint<int> p0; //这里相当于把int代回模版中T的位置
p0.X(10);
p0.Y(20);
p0.Print();
C2DPoint<float> p1(100, 200.5);//这里相当于把float代回模版中T的位置
p1.Print();
return 0;
}

热心网友 时间:2022-06-20 22:34

template<class T> 算不上参数。这句主要是说类Smemory使用了带参数 T 的类模板,是模板声明。
就是说Smemory类里使用了 T 类型的数据或对象。在具体使用时,要进行初始化。例如:要建立类 Smemory的对象。可以如下:
Smemory<int> obj;
Smemory<double> obj1;
还可以进行其他类型的初始化。
自己写的一个简单的图形类,可以参考一下:
#include <iostream>
using namespace std;
const double PI=3.1415926;
template<class T>
class Shape
{
protected:
T x,y;
public:
Shape(T tx,T ty){x=tx;y=ty;}
virtual T area()=0;
virtual T length()=0;
virtual void show()=0;
};

template <class T>
class Circle:public Shape<T>
{
protected:
T radius;
public:
Circle(T x,T y,T r):Shape<T>(x,y){radius=r;}
T area(){return PI*radius*radius;}
T length(){return 2*PI*radius;}
void show(){cout<<"Area="<<area()<<",Length="<<length()<<endl;}
};

template <class T>
class Rectangle:public Shape<T>
{
protected:
T h,w;
public:
Rectangle(T x,T y,T th,T tw):Shape<T>(x,y){h=th;w=tw;}
T area(){return h*w;}
T length(){return 2*(h+w);}
void show(){cout<<"Area="<<area()<<",Length="<<length()<<endl;}
};

void main()
{
Circle<double> Cobj(2,3,1);
Rectangle<double> Robj(2,3,3,4);
Cobj.show();
Robj.show();

void (Shape<double>::*pf)();
pf=Shape<double>::show;
(Cobj.*pf)();
(Robj.*pf)();

Shape<double> *p;
p=&Cobj;
p->show();
p=&Robj;
p->show();

system("pause");
}

热心网友 时间:2022-06-20 22:35

T 就是定义了一种类型 在后面使用的时候 会给他一个初始化的值
#include<iostream>
using namespace std;
const int StackSize=100;
template<class T>
class SeqStack
{
public:
SeqStack(){top=-1;}
~SeqStack(){}
void Push(T x);
T Pop();
T GetTop(){if(top!=-1)return data[top];}
bool Empty();
void Print();
private:
T data[StackSize];
int top;
};
template<class T>
bool SeqStack<T>::Empty()
{
if (top==-1)
return true;
else return false;
}

template<class T>
void SeqStack<T>::Push(T x)
{
if(top == StackSize-1)throw"上溢";
top++;
data[top]=x;
}
template<class T>
T SeqStack<T>::Pop()
{
if (top==-1)throw"下溢";
T x=data[top];
top--;
return x;
}
template<class T>
void SeqStack<T>::Print()
{
int i;
cout<<"the stack is:"<<endl;
cout<<"-------------"<<endl;
for(i=top;i>=0;i--)
{
cout<<" "<<data[i]<<endl;
cout<<"-------------"<<endl;
}
}
int main()
{
SeqStack<int>Stack;
int a,b,tab,f;
int flag=1;
f=0;
while(f==0)
{
cout<<"***************************"<<endl;
cout<<"*1.push *"<<endl;
cout<<"*2.pop *"<<endl;
cout<<"*3.if empty *"<<endl;
cout<<"*4.get top data *"<<endl;
cout<<"*5.exit *"<<endl;
cout<<"***************************"<<endl;
cin>>tab;
switch (tab)
{
case 1:
{
cout<<"please input a number:"<<endl;
cin>>a;
Stack.Push(a);
Stack.Print();
break;
}
case 2:
{
b=Stack.Pop();
cout<<"the number is:"<<b<<endl;
Stack.Print();
break;
}
case 3:
{
if(Stack.Empty())cout<<"true"<<endl;
else cout<<"flase"<<endl;
break;
}
case 4:
{
a=Stack.GetTop();
cout<<a<<endl;
break;
}
default:
{
f=1;
}
}
}
Stack.~SeqStack();
return 0;
}

热心网友 时间:2022-06-20 22:35

里面放一个类型,这个类里的所有T都成这个类型
c语言中的模板类的定义是什么意思?

这是建立模板的固定形式,template即模板,class指类别,T是类别的统称,可以使用的数据类型有int、char,float,double等等。举个例子:template &lt; typename T &gt;T min( T a, T b ){return a &gt; b ? b : a;}这个 max 函数就是一个模板函数,它可以传入一个 “类型”的参数,以便实现任意类型...

c 的类是什么意思啊

以下是关于C中类的详细解释:1. 基本定义:在C++中,类是创建对象的蓝图或模板。它定义了一个数据类型及其相关的属性和方法。类是面向对象编程的基石,它允许程序员将数据和相关联的功能封装在一起。2. 属性的定义:类中的属性代表对象的特征或状态。例如,如果我们创建一个表示“汽车”的...

C 中为什么用模板类

(1)可用来创建动态增长和减小的数据结构 (2)它是类型无关的,因此具有很高的可复用性。(3)它在编译时而不是运行时检查数据类型,保证了类型安全 (4)它是平台无关的,可移植性 (5)可用于基本数据类型

模具ABC板是什么

A板指的是母模板cavity plate(前模板、定模板)B板指公模板core plate(后模具板、动模板)C板指模脚support block(方铁或垫块)

c 的类是什么意思啊

C中的类是面向对象编程的一个核心概念。以下是详细解释:在C语言中,类是面向对象编程的一个基本单位。它描述了一组具有共同属性和行为的对象。类定义了一个蓝图或者模板,从这个模板可以创建多个对象实例。每一个对象实例都代表了该类的一个具体实体,拥有类定义的属性和行为。这些属性和行为被称为类的...

土建资料中的A类、 B类、 C类和D类都是什么意思啊?

1、A类是前期资料,是建设单位的;2、B类是监理资料;3、C类是施工单位资料;4、D类是竣工图纸。

类模板的使用实际上是将类模板实例化成一个具体的( )。 A.类B.对象C...

【答案】:A A。【解析】类模板就是把畿中的数据分离出来,作为一个类的描述。C++编译器根据类模板和特定的数据类型来产生一个类,类模板就是一个抽象的类。

C语言elemtype

我理解你说的意思是不是想让elemtype可以替换任意一种类型?如果是的话,这种东西叫做模板,它是C++的内容,不在C语言的范畴内。具体用法是:template &lt;typename elemtype&gt; typedef struct{ elemtype *elem;int length;int listsize;}sqlist;之后声明变量时要赋予elemtype一个已知的类型,比如int。struct...

Visual C++ 各种字母的标识含义

g_cch : g_ 是属性描述,表示全局变量,c 和 ch 分别是计数类型和字符类型,一起表示变量类 型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。上面就是HN命名法的一般规则。小结:匈牙利命名法 匈牙利命名法 MFC、句柄、控件及结构的命名规范 Windows类型 样本变量 MFC类 样本变量 H...

CList类是作什么用的?

通常的做法是将模板类的函数实现也放在定义该类的头文件中 ,这样只需在调用的源文件中包含该头文件即可。 那么,如何使用生成特定的类实例呢?我们可以像使用其他类一样来使用模板类, 不过必须指定模板参数的值。例如采用如下声明: CList &lt;int, 100&gt; IntList; 则使IntList成为CList类的实例,每次出现的T参数都换...

类模板和模板类 类模板和模板类的区别 对文章标题的理解模板 什么是模板 阅读理解题目模板 如何理解定额中模板含量 理解句子含义答题模板 语文阅读理解模板 小学阅读理解模板
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
五羊本田摩托车125c太费油 拖泥带水,束手无策,是什么生肖? 北汽幻速S7两年车都有哪些费用? 新北汽幻速s7这款车后期的维护大致要多少钱?花费大吗? 新学期的打算250字作文。。。急急 一般冷暴力的话有什么? 逻辑学怎么造句 想知道: 松原市 从长岭县到集体乡胜利村怎么坐公交 孕期不同阶段进行自然胎教的方法 香港路•浅水湾配套信息 模板是什么? 什么是模板? 百度文库 什么是模板,怎么用 “模板”是什么意思? 个人社保申请书怎么写 城管都是公务员考试进去的吗 公务员考杭州城管怎么样? 行政执法类公务员与普通公务员的区别? 法院如何强制执行房产 被执行人可办房产证但未办的房屋法院可否强制执行? 欠债人只有一处房产,可以申请强制执行吗? 复仇者联盟里绿巨人和雷神哪个更厉害? 唯一的抵押权房屋可以申请强制执行吗 漫威里面有哪些被电过的英雄吗,进来看看你认识几个 漫威雷神索尔到底是来自外星球还是所谓的仙界? 奇异博士里的雷神是谁演的 如果我要是像法院申请强制执行房产证更名 大概要多久? 什么情况下法院会强制执行?房产会被执行吗? 房屋交付可否申请强制执行 漫威里面雷神这么强大,为何不做“复仇者联盟”的领导? 外地户籍老人随子女落户北京有什么现实的好处? 请教父母随子女迁到北京的户口和医保问题! 传闻中的七公主 大概的剧情是什么样的? 福清市宏亚帆布有限公司怎么样? 传闻中的七公主的剧情简介 请问外地老人可以投靠子女办北京户口吗 专业游戏本品牌都有哪些 投靠子女落户北京的退休老人公租房子可以申请吗本人和老伴都已退休,2019年投奔子女落户北京市丰台区_百度问一问 父母户口随子女迁入北京的问题? 格力落地式冷风机不工作是什么原因? 重庆吉文篷布有限责任公司怎么样? 山东菩佑篷布制品有限公司怎么样? 2020今年河南的公务员的考试难吗? 三星玄龙骑士键盘灯驱动被加速掉了 河南公务员好考吗 济南恒屹防水材料厂怎么样? 吉林省公务员考试内容有哪些 我想买一台笔记本电脑,5k至6k左右的买什么牌子的,主要是玩大型单机游戏 吨包线要分叉是咋回事 河南省公务员好考吗?