zoukankan      html  css  js  c++  java
  • 初步C++类模板学习笔记

    类模板

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

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

     

     

     

    类模板的定义


    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

     

     

     

     

     

     

  • 相关阅读:
    【Nginx】url 带有 “https://” 双斜杠特殊处理
    【layui】tepmlet 格式化 table 数据
    于二零二零年:终章
    【Golang】练习-Web 处理 form 表单请求失败不刷新页面并保存输入的数据
    实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
    面向对象的进阶(item系列,__new__,__hash__,__eq__)
    面向对象阶段复习
    计算器实例
    反射
    静态方法staticmethod和类方法classmethod
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4592302.html
Copyright © 2011-2022 走看看