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

类模板

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

在调用类模板时, 指定参数, 由编译系统根据参数提供的数据类型自动产生相应的模板类                   -->具体的类。

类模板的定义

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

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

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

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

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

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

如果类模板有无参构造函数, 那么也可以只写:

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

举例:

template <class T1, class T2>
class Pair{
public:
    T1 key;  //关键字
    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++类模版学习笔记,布布扣,bubuko.com

时间: 2024-10-10 13:32:14

初探C++类模版学习笔记的相关文章

初探C++函数模版学习笔记

泛型程序设计 特点:算法实现时不指定具体要操作的数据的类型.算法实现一遍但可适用于多种数据结构. 优势:减少重复代码的编写. 实现:大量编写模板, 使用模板的程序设计. 函数模版 为了交换两个int变量的值, 需要编写如下Swap函数: void Swap(int & x, int & y) { int tmp = x; x = y; y = tmp; } 为了交换两个double型变量的值, 还需要编写如下Swap函数: void Swap(double & x, double

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

初探swift语言的学习笔记(类对象,函数)

swift扩展了很多功能和属性,有些也比较奇P.只有慢慢学习,通过经验慢慢总结了. 下面将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // Created by apple on 14-6-8. // Copyright (c) 2014年 fengsh. All rights reserved. /* 写本例子的目的在于快速学习swift类的写法,包括知识点: 1.属性设置 2.构造.释构 3.

初探swift语言的学习笔记十一(performSelector)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了.更有甚者连IMP, objc_msgSend也不能用了.虽然想不通为什么,但应该有他的道理.就不纠结了. 大家可能在OC中使用得更多的就是延时处理,及后台处

初探C++运算符重载学习笔记&lt;1&gt;

运算符重载 含义: 对抽象数据类型也能够直接使用C++提供的运算符 对已有的运算符赋予多重的含义 使同一运算符针对不同的数据类型产生不同的行为 目的: -->扩展C++运算符的适用范围,以用于类所表示的抽象数据类型 -->程序更简洁 -->代码可读性更好 例如complex_a和complex_b是两个复数对象,如果求和,希望能直接写成 complex_a + complex_b  这样的形式. 实质: 函数重载 返回值类型 operator 运算符(参数表) { .... } 在函数编

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

初探swift语言的学习笔记(可选类型?和隐式可选类型!)

可选类型.隐式可选类型 其次swift还引入一个较有趣的初始值设置语法使用"?"操作符及"!"号操作符 如:"var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = op

初探swift语言的学习笔记九(OC与Swift混编)

swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. 先中简单的入手,先研究在同一个工程目录下混合使用的情况. 为了演示.先准备两个类 第一个是swift语言写的类,文件名为 act.swift import Foundation class Act : NSObject { func hasAct(tag:Int) -> String { swit

初探C++运算符重载学习笔记&amp;lt;2&amp;gt; 重载为友元函数

初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 <2>普通函数又不能訪问类的私有成员时 举例说明: class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); };