1. 程式人生 > >4. STL編程四

4. STL編程四

sta += etag 規則 == 不一致 必須 數據 pan

1. 類模板的默認參數規則:

#include <iostream>
using namespace std;

/*
//類模板,不調用不編譯(函數);變量還是規範
template<class T = int>    //即使參數默認,調用的時候還是要指明類型
class myclass
{
public:
    T a;
    T b;

    T add()
    {
        return a + b;
    }

};

int main()
{
    myclass<int> my;
    my.a = 10;
    my.b = 20;
    my.add();

    system("pause");
    return 0;
}
*/ template<class T1, class T2 = double, class T3 = char> //默認參數,原則上都放在右邊 class myclassT { public: }; int main() { myclassT<int> my1; //<>無論如何都不能省略, //有默認參數原則上可以省略;如果中間出現一個沒有省略,需輸入若幹參數,覆蓋那個位置 system("pause"); return 0; }

2. 類模板的嵌套:

#include <iostream>
#include 
<vector> #include <list> using namespace std; /* //類的懷孕現象 class my { public: class zi //嵌套類 { }; zi z1; }; */ template<class T> class myT { public: template<class T> //嵌套類模板 class ziT { T a; public: void seta(T t) { a
= t; } T geta() { return a; } }; ziT<int> my1; //無論外部什麽類型,始終都是int ziT<T> my2; //外部什麽類型,內部也是該類型 vector<T> myv; list<T> myx; }; int main() { myT<double> d1; system("pause"); return 0; }

3. 模板參數的嵌套:

#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;

/*
int main()
{
    vector<int>                        myint1;
    vector< vector<int> >              myint2;    //二維數組
    vector< vector< vector<int> > >    myint3;    //三位數組

    system("pause");
    return 0;
}
*/

template<class T>
class men
{
public:
    men()
    {
        
    }
    ~men()
    {

    }
    T getAge()
    {
        return age;
    }
    T getName()
    {
        return name;
    }
    void setAge(T && a)
    {
        age = a;
    }
    void setName(T & n)
    {
        name = n;
    }

private:
    T name;
    T age;

};

template<template<class T>class T1>        //此時 T1 <==> men
class people
{
public:
    T1<int> s1;            //T1<int> <==> men<int>
    T1<string> s2;

    people()
    {
        
    }
    ~people()
    {

    }

};

int main()
{
    people<men> chinese;

    chinese.s1.setAge(50);
    cout << chinese.s1.getAge() << endl;

    chinese.s2.setAge("中國人");
    cout << chinese.s2.getAge() << endl;

    system("pause");
    return 0;
}

    技術分享圖片

4. 模板與友元函數:

  4.1 類模板 與 友元函數模板:

#include <iostream>
using namespace std;

template<class T>
class myclass
{
public:
    myclass(T m, T n):a(m),b(n)
    {
    }
    ~myclass()
    {

    }
private:
    T a;
    T b;

    template<class T>
    friend void show(myclass<T> my);        //友元函數聲明,聲明也必須帶上template

    friend void show(myclass<double> my);   //明確類型的調用
};

template<class T>
void show(myclass<T> my)
{
    cout << my.a << " " << my.b << endl;
}

void show(myclass<double> my)
{

}

int main()
{
    myclass<int> my1(29, 39);
    show(my1);

    system("pause");
    return 0;
}

    技術分享圖片

  4.2 類模板 與 友元類模板:

#include <iostream>
using namespace std;

template<class T> class showit;    //先聲明showit類,引用友元類,創建引用或指針,唯獨不能創建對象

template<class T>
class myclass
{
public:
    myclass(T m, T n) :a(m), b(n)
    {
    }

private:
    T a; 
    T b;

    friend class showit<T>;    //聲明友元類,該類為一個類模板
};

template<class T>
class showit
{
public:
    myclass<T> *p;
    void set(T a, T b)
    {
        p = new myclass<T>(a, b);
        cout << p->a << " " << p->b << endl;
    }
};

int main()
{
    showit<int> showit1;
    showit1.set(99, 87);

    system("pause");
    return 0;
}

    技術分享圖片

5. 類模板與static靜態成員:

#include <iostream>
using namespace std;

template<class T>
class myclass
{
public:
    //靜態成員不屬於這個類,它在靜態區,不能將其值設定在內部,
    //static int num = 0;    //error C2864: “myclass<T>::num”: 帶有類內初始值設定項的靜態 數據成員 必須具有不可變的常量整型
    static int num;

    myclass()
    {
        num += 1;
    }
    ~myclass()
    {
        num -= 1;
    }
    void show()
    {
        cout << "num=" << num << endl;
        cout << typeid(*this).name() << endl;
    }
};

template<class T>
int myclass<T>::num = 0;

//static成員,每個類型實例化都會創建一個變量;類型一致,共享;類型不一致,私有。
int main()
{
    myclass<int> *p1 = new myclass<int>[10];    //調用10次構造函數
    myclass<int> *p3 = new myclass<int>[10];
    p1->show();        //20    類型一致,共享

    myclass<double> *p2 = new myclass<double>[19];    
    p2->show();        //19    類型不一致

    system("pause");
    return 0;
}

    技術分享圖片

6. 類模板與static靜態成員函數:

  6.1 static靜態成員函數沒有this指針:

#include <iostream>
using namespace std;

template<class T>
class myclass
{
public:
    void go1()
    {
        this;
    }
    static void go2()    //靜態成員函數的指針類型不一樣,沒有this指針
    {
        
    }
};

int main()
{
    auto fun1 = &myclass<int>::go1;
    auto fun2 = &myclass<int>::go2;

    //成員函數與靜態成員函數最大區別,函數指針類型不一樣,靜態成員函數沒有this指針
    cout << typeid(fun1).name() << endl;
    cout << typeid(fun2).name() << endl;

    myclass<char> mych;

    system("pause");
    return 0;
}

    技術分享圖片

  6.2 靜態成員函數無需創建對象就可調用:

#include <iostream>
using namespace std;

template<class T>
class myclass
{
public:
    void go1()
    {
        cout << "go1" << endl;
    }
    static void go2()    //靜態成員函數的指針類型不一樣,沒有this指針
    {
        cout << "go2" << endl;
    }
};

int main()
{
    myclass<int>::go2();    //靜態成員函數,無需創建對象就可以直接調用(既可以創建對象來調用,也可以不創建對象來調用)
    //myclass<int>::go1();

    myclass<int> my1;
    my1.go1();
    my1.go2();

    system("pause");
    return 0;
}

    技術分享圖片

4. STL編程四