类模板

实现:在上课时间的定义给它的一个或多个参数,这些参数代表了不同的数据类型。                              -->抽象的类。

在调用类模板时, 指定參数, 由编译系统依据參数提供的数据类型自己主动产生对应的模板类                   -->详细的类。

类模板的定义

C++的类模板的写法例如以下:

template <类型參数表>        //类型參数表的写法就是:class 类型參数1, class 类型參数2, …
class 类模板名
{
成员函数和成员变量
};

类模板里的成员函数, 如在类模板外面定义时,

template <型參数表>
返回值类型 类模板名<类型參数名列表>::成员函数名(參数表)
{
……
}

用类模板定义对象的写法例如以下:

类模板名 <真实类型參数表>  对象名(构造函数实际參数表);

假设类模板有无參构造函数, 那么也能够仅仅写:

类模板名 <真实类型參数表>  对象名;

举例:

template <class T1, class T2>
class Pair{
public:
T1 key; //keyword
T2 value; //值
Pair(T1 k,T2 v):key(k),value(v) { };
bool operator < (const Pair<T1,T2> & p) const;
}; template<class T1,class T2> //在类外定义 Pair的成员函数 operator <
bool Pair<T1,T2>::operator<( const Pair<T1, T2> & p) const
{ return key < p.key; }

Pair类模板的使用:

int main()
{
Pair<string, int> student("Tom",19);
//实例化出一个类 Pair<string, int>
cout << student.key << " " << student.value;
return 0; }

函数模版作为类模板成员

#include <iostream>
using namespace std;
template <class T>
class A{
public:
template<class T2>
void Func(T2 t) { cout << t; } //成员函数模板
};
int main(){
A<int> a;
a.Func('K'); //成员函数模板 Func被实例化
return 0;
}

类模板与非类型參数

template <class T, int size>
class CArray{
T array[size];
public:
void Print( )
{
for(int i = 0; i < size; ++i)
cout << array[i] << endl;
}
};
CArray<double, 40> a2;
CArray<int, 50> a3;

注意:

CArray<int,40>和CArray<int,50>全然是两个类

这两个类的对象之间不能互相赋值

类模板与继承

普通类从模板类派生

template <class T>
class A { T v1; int n; };
class B:public A<int> { double v; };// 类A是个类模板。A<int>是模板类
int main() {
B obj1;
return 0;
}

类模板从模板类派生

template <class T1, class T2>
class A { T1 v1; T2 v2; }; template <class T>
class B:public A<int, double> { T v; };
int main() { B<char> obj1; return 0; }

类模板A   ->实例化  模板类A<int,double>  ->派生   类模板B   ->实例化  模板类B<char>

此时B中有成员

int v1;

double  v2;

T v;

类模板从普通类派生

class A {  int v1; };

template <class T>
class B:public A { T v; };
int main() {
B<char> obj1;
return 0;
}

没什么可说的。在继承A的基础上添加了T类型的成员。

类模板从类模板派生

#include <iostream>
using namespace std;
template <class T1, class T2>
class A
{
public:
T1 v1; T2 v2;
}; template <class T1, class T2>
class B:public A<T1,T2>
{
public:
T1 v3; T2 v4;
}; int main()
{
B<int,double> b;
B<int,double> *pb = &b;
b.v1 = 1;
b.v3 = 3;
b.v2 = 2.2;
b.v4 = 4.4;
cout << pb->v1<<endl;
cout << pb->v2<<endl;
cout << pb->v3<<endl;
cout << pb->v4<<endl; return 0;
}

要保证当给类模板B实例化的时候。类模板A也随之完毕类型T的实例化。

B<int,double> b 时,B有自身的成员int v3 、double v4 也有继承A<int,double>的成员int v1 和 double v2

初步C++类模板学习笔记的更多相关文章

  1. 《C++ Primer Plus》14.4 类模板 学习笔记

    14.4.1 定义类模板下面以第10章的Stack类为基础来建立模板.原来的类声明如下:typedef unsigned long Item; class Stack{private:    enum ...

  2. 初步C++运算符重载学习笔记&lt;3&gt; 增量递减运算符重载

    初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数     增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...

  3. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  4. python 面向对象(类)--学习笔记

    面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...

  5. C++模板学习笔记

    一个有趣的东西:实现一个函数print, 输入一个数组, 输出数组的各个维度长度. eg. ], b[][], c[][][]; print(a); //(2, 4) print(b); //(3, ...

  6. 初探C++类模版学习笔记

    类模板 实现:在定义类的时候给它一个或多个參数,这个些參数表示不同的数据类型.                              -->抽象的类. 在调用类模板时, 指定參数, 由编译系 ...

  7. C++Array类模板编写笔记

    C++Array类模板 函数模板和类模板都属于泛型技术,利用函数模板和类模板来创建一个具有通用功能的函数和类,以支持多种不同的形参,从而进一步简化重载函数的函数体设计. 声明方法:template&l ...

  8. c++类的学习笔记

    用结构体数据的安全性得不到保证. 使用类对数据进行封装,只能通过函数修改类中的数据 (1)类的定义 class 类名 { private: protected: public: }; private: ...

  9. tornada模板学习笔记

    import tornado.web import tornado.httpserver import tornado.ioloop import tornado.options import os. ...

随机推荐

  1. 【m从翻译os文章】写日志禁令Sqlnet.log和Listener.log

    写日志禁令Sqlnet.log和Listener.log 参考原始: How to Disable Logging to the Sqlnet.log and the Listener.log (Do ...

  2. 单例模式(Singleton)Holder

    public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ ...

  3. ezw证件照芯片压缩算法

    相关网站:http://m.blog.csdn.net/blog/kimwu/12654517 http://blog.sina.com.cn/s/blog_4be751690100bsgb.html ...

  4. Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布

    首先是准备工作,去QT主页下载独立的QT类库安装包以及完整QT SDK安装包,还有QT Creator for windows 版 下载地址:http://qt.nokia.com/downloads ...

  5. thinkPHP 模板中的语法知识 详细介绍(十二)

    原文:thinkPHP 模板中的语法知识 详细介绍(十二) 本章节:介绍模板中的语法,详细的语法介绍 一.导入CSS和JS文件    ==>记住常量的是大写 1.css link .js  sc ...

  6. phpc.sinaapp.com 加密的解密方法

    原文:phpc.sinaapp.com 加密的解密方法 很简单,用类似phpjm的解密方式,替换掉_inc.php中最后一个return中的eval为print就出来了.

  7. dom4j的用法

    package xml; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; impor ...

  8. 使用WIX打包客户端程序

    原文:使用WIX打包客户端程序 用WPF为客户做了个小工具,打包的时候发现VS2012居然没有安装项目了,搜了下才知道现在推荐使用WIX来打包了http://wix.sourceforge.net/, ...

  9. 关于JVM的ClassLoader(转)

    众所周知,java是编译型的语言,写的是java文件,最后运行的是class文件,class文件是运行在JVM之中的,这时候就有一个问题,JVM如何装载class文件的?是通过ClassLoader来 ...

  10. ZTESoft 持续集成 编年史 之 持续集成建设---自主研发(总括)

    最终选择了自主研发,考虑到我们团队对java以及flex知识的储备,展示层使用夸浏览器的flex开发,后端业务层使用java. 一.方案: BEC + ZCIPAgent + ZCIPServer + ...