C++之模板(友元函数+友元类+静态Static)

来源:互联网 发布:趣味java 编辑:程序博客网 时间:2024/05/14 00:11

友元函数
友元函数分为友元全局函数和友元成员函数。
下面是一个友元全局函数的例子:

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

友元函数的应用

void printXY(Coordinate &c){    cout << c.m_iX << c.m_iY << endl;//友元函数可以顺利访问private}int main(){    Coordinate coor(3, 5);    printXY(coor);//传入对象名而非地址    return 0;}

下面是友元成员函数的例子

class  Coordinate{    friend void Circle::printXY(Coordinate &c);//是Circle类的成员函数public:    Coordinate(int x, int y);private:    int m_iX;    int m_iY;};class Circle{    void printXY(Coordinate &c)    {        cout << c.m_iX << c.m_iY << endl;    }};int main(){    Coordinate coor(3, 5);    Circle circle;    circle.printXY(coor);//传入对象名而非地址    return 0;}

友元函数也存在一定的风险,在上述代码中,通过成员函数很方便的访问Coordinate的私有成员,很方便,但同时也破坏了它的封装性,当不小心改了这个值以后,也很不容易察觉。

友元类
友元类的声明和友元函数的声明很相似,如下述代码

class Circle;//要告诉计算机,这个类是定义过的class  Coordinate{    friend Circle;public:    Coordinate(int x, int y);private:    int m_iX;    int m_iY;};

在实现Circle类的时候,可以在类中数据成员中包含一个友元的类,并调用其私有成员,如下述代码所示

class Circle{public:    void printXY(c)    {        cout << c.m_iX << c.m_iY << endl;    }private:    Coordinate m_coor;};

接下来我们来讲一下友元的注意事项
1.友元关系不可传递
2.友元关系的单向性
3.友元声明的形式和数量不受限制
最后我们需要知道的是友元只是封装的补充,其本身并不是一个很好的语法。友元破坏了类的封装性,所以尽量不要用友元。

静态 (static)
C++中的静态分为静态数据成员和静态成员函数。
静态数据成员依赖于类,而不依赖于对象,这意思就是说静态数据成员即使不实例化,在内存中也存在,他不需要在构造函数中实例化,它的实例化往往是单独进行的,而普通的数据成员不实例化就不存在,如下述代码:

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;//不需要再加关键字static

那么作为访问方法来说有两种,一种是不通过类,而是直接通过对象的访问方法;另一种是如果我们定义了对象,可以通过对象的方式来调用。如下代码所示

int main(){    cout << Tank::getCount() << endl;//直接访问    cout << Tank::s_iCount << endl;    Tank tank;    cout << tank.getCount() << endl;//通过对象访问    cout << tank.s_iCount << endl;    return 0;}

静态函数不能调用非静态的成员,因为static成员一直存在,但是如果没有实例化的话,就无法调用非静态的成员。

静态函数不能加const,因为const修饰的是this指针,静态函数本身没有this指针,所以不可能使用。

下面来说一下静态的注意事项:
1.静态数据成员必须进行单独的初始化
2.静态的成员函数不能调用非静态的成员函数和非静态的数据成员,反之可以。
3.静态的数据成员只有一份,且不依赖于对象而存在。

0 0