C++複習之模板(自己要驗證,才能更好掌握)

友元函數

#include <iostream>

using namespace std;

class Coordinate
{
    friend void printXY(Coordinate &c);
public:
    Coordinate(int x,int y);
private:
    int m_iX;
    int m_iY;
};
Coordinate::Coordinate(int x,int y)
{
    m_iX = x;
    m_iY = y;
}
void printXY(Coordinate &c)
{
    cout<<c.m_iX<<","<<c.m_iY;
}

int main()
{
    Coordinate coor(3,5);
    printXY(coor);
    return 0;
}

友元類

class Circle;
class Coordinate
{
    friend Circle;
    friend void printXY(Coordinate &c);
public:
    Coordinate(int x,int y);
private:
    int m_iX;
    int m_iY;
};

class Circle
{
public:
    void printXY()
    {
        cout<<m_coor.m_iX<<m_coor.m_iY;
    }
private:
    Coordinate m_coor;
};在這裏插入代碼片

友元關係不可傳遞;
友元關係具有單向性;
友元聲明的形式和數量不受限制;
友元只是封裝的補充,設計巧妙可以避開就更好,不然會暴露數據。

靜態

#include <iostream>

using namespace std;

class Tank
{
public:
    Tank(){s_iCount++;}
    ~Tank(){s_iCount--;}
    static int getCount(){return s_iCount;}
    static int s_iCount;
private:
    string m_strCode;
};
int Tank::s_iCount = 0;

int main()
{
    cout<<Tank::getCount()<<endl;
    cout<<Tank::s_iCount<<endl;
    Tank tank;
    cout<<tank.getCount()<<endl;
    cout<<tank.s_iCount<<endl;
    return 0;
}

靜態的成員函數只能操作靜態數據。
因爲靜態是隨類存在,編譯的。
靜態數據成員必須單獨 初始化。
靜態數據成員只有一份,且不依賴對象而存在,求一個對象的大小時是不包含靜態數據的。

運算符重載

本質:函數重載
關鍵字:operator
一元運算符的重載

-負號的重載:
成員函數的重載:

#include <iostream>

using namespace std;

class Coordinate
{
public:
    Coordinate(int x, int y);
    Coordinate& operator-();
private:
    int m_iX;
    int m_iY;
};

Coordinate::Coordinate(int x, int y)
{
    m_iX = x;
    m_iY = y;
}

Coordinate& Coordinate::operator-()
{
    m_iX = -m_iX;
    m_iY = -m_iY;
    return *this;
}

int main()
{
    Coordinate coor1(3,5);

    -coor1;  //等價於coor1.operator-();
    return 0;
}

友元函數重載:

#include <iostream>

using namespace std;

class Coordinate
{
    friend Coordinate operator-(Coordinate &coor);
public:
    Coordinate(int x, int y);
private:
    int m_iX;
    int m_iY;
};

Coordinate::Coordinate(int x, int y)
{
    m_iX = x;
    m_iY = y;
}

Coordinate operator-(Coordinate &coor)
{
    coor.m_iX = -coor.m_iX;
    coor.m_iY = -coor.m_iY;
    return coor;
}

int main()
{
    Coordinate coor1(3,5);

    -coor1;  //等價於operator-(coor1);
    return 0;
}

後置++重載

#include <iostream>

using namespace std;

class Coordinate
{
public:
    Coordinate(int x, int y);
    Coordinate operator++(int);  //後置++,裏面的int只是後置運算符的標誌
private:
    int m_iX;
    int m_iY;
};
Coordinate::Coordinate(int x, int y)
{
    m_iX = x;
    m_iY = y;
}
Coordinate Coordinate::operator++(int)
{
    Coordinate old(*this);
    m_iX++;
    m_iY++;
    return old;
}

int main()
{
    Coordinate coor1(3,5);
    coor1++;  //coor1.operator++(0);
    return 0;
}

<<運算符重載

#include <iostream>

using namespace std;

class Coordinate
{
    friend ostream& operator<<(ostream &out, const Coordinate &coor);
public:
    Coordinate(int x, int y);
private:
    int m_iX;
    int m_iY;
};

Coordinate::Coordinate(int x, int y){
    m_iX = x;
    m_iY = y;
}

ostream& operator<<(ostream &out, const Coordinate &coor)
{
    out<<coor.m_iX<<","<<coor.m_iY;
    return out;
}

int main()
{
    Coordinate coor(3,5);
    cout<<coor;  //operator<<(cout,coor);
    return 0;
}

函數模板

#include <iostream>

using namespace std;

template <class T>
T maxx(T a,T b)
{
    return (a>b)?a:b;
}

int main()
{
    int ival = maxx(100,99);
    char cval = maxx<char>('A','B');
    cout<<ival<<endl;
    cout<<cval<<endl;
    return 0;
}

變量作爲函數模板

template <int size>
void display()
{
    cout<<size<<endl;
}
int main(){
    display<10>();
}

多參數函數模板

template <typename T, typename C>
void display(T a, C b)
{
    cout<<a<<" "<<b<<endl;
}
int main()
{
    int a=1024;
    string str = "hello world!";
    display<int, string>(a,str);
    return 0;
}

typename和class可以混用。

類模板

模板代碼暫時不能分離編譯。
得將所有代碼都寫在h文件裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章