C++进阶—>类模板

1类模板

1.1为什么需要类模板

类模板与函数模板的定义和使用类似,我们已经进行了介绍。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:

 

Ø 类模板用于实现类所需数据的类型参数化

Ø 类模板在表示如数组、表、图等数据结构显得特别重要,

    这些数据结构的表示和算法不受所包含的元素类型的影响

1.2继承中的类模板语法

 

//结论: 子类从模板类继承的时候,需要让编译器知道 父类的数据类型具体是什么(数据类型的本质:固定大小内存块的别名)A<int>

//

class B : public A<int>

{

public:

B(int i) : A<int>(i)

{

 

}

void printB()

{

cout<<"A:"<<t<<endl;

}

protected:

private:

};

 

//模板与上继承

//怎么样从基类继承  

//若基类只有一个带参数的构造函数,子类是如何启动父类的构造函数

void pintBB(B &b)

{

b.printB();

}

void printAA(A<int> &a)  //类模板做函数参数 

{

 //

a.getT();

}

 

void main()

{

A<int>  a(100); //模板了中如果使用了构造函数,则遵守以前的类的构造函数的调用规则

a.getT();

printAA(a);

 

B b(10);

b.printB();

 

 

cout<<"hello..."<<endl;

system("pause");

return ;

}

 

1.3类模板语法知识体系梳理

1.3.1所有的类模板函数写在类的内部

所有类的成员函数或重载函数都在类的内部定义并实现。

1.3.2所有的类模板函数写在类的外部,在一个cpp

//构造函数 没有问题

//普通函数 没有问题

//友元函数:用友元函数重载 << >>

// friend ostream& operator<< <T> (ostream &out, Complex<T> &c3) ;

//友元函数:友元函数不是实现函数重载(非 << >>

//1)需要在类前增加 类的前置声明 函数的前置声明

template<typename T>

class Complex;  

template<typename T>

Complex<T> mySub(Complex<T> &c1, Complex<T> &c2);

 

//2)类的内部声明 必须写成:

friend Complex<T> mySub <T> (Complex<T> &c1, Complex<T> &c2);

//3)友元函数实现 必须写成:

template<typename T>

  Complex<T> mySub(Complex<T> &c1, Complex<T> &c2)

{

Complex<T> tmp(c1.a - c2.a, c1.b-c2.b);

return tmp;

}

//4)友元函数调用 必须写成

Complex<int> c4 = mySub<int>(c1, c2);

cout<<c4;

结论:友元函数只用来进行 左移 友移操作符重载。

1.3.3所有的类模板函数写在类的外部,在不同的.h.cpp,

也就是类模板函数说明和类模板实现分开

//类模板函数

构造函数

普通成员函数

友元函数

用友元函数重载<<>>;

用友元函数重载非<< >>

//要包含.cpp

1.3.4总结

归纳以上的介绍,可以这样声明和使用类模板:

1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。

2) 将此类中准备改变的类型名(int要改变为floatchar)改用一个自己指定的虚拟类型名(如上例中的numtype)

3) 在类声明前面加入一行,格式为:

    template <class 虚拟类型参数>

如:

    template <class numtype> //注意本行末尾无分号

    class Compare

    {}; //类体

4) 用类模板定义对象时用以下形式:

    类模板名<实际类型名> 对象名;

    类模板名<实际类型名> 对象名(实参表列);

如:

    Compare<int> cmp;

    Compare<int> cmp(3,7);

5) 如果在类模板外定义成员函数,应写成类模板形式:

   template <class 虚拟类型参数>

   函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表列) {}

关于类模板的几点说明:

1) 类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如:

    template <class T1,class T2>

    class someclass

    {…};

在定义对象时分别代入实际的类型名,如:

    someclass<int,double> obj;

2) 和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。

3) 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。

1.4类模板中的static关键字

Ø 从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员

Ø  和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化

Ø  每个模板类有自己的类模板的static数据成员副本

 




原理图



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值