Friend友元函数以及单例模式

编程入门 行业动态 更新时间:2024-10-25 16:20:34

Friend友元<a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数以及单例模式"/>

Friend友元函数以及单例模式

友元函数

  定义:友元函数是赋予全局函数,类的成员函数,类,有访问别的类的私有成员的权限

  注意:友元函数不是类的成员函数

  友元函数的申明:

class Building
{//申明这个全局函数为Building类的友元函数,放哪都可以,这是申明friend void GoodGay(Building& bd);//注意:友元函数不是类的成员函数!!......
};void GoodGay(Building &bd)
{cout << "好基友访问:" << bd.keting << endl;cout << "好基友访问:" << bd.woshi << endl;
}

友元类

  定义:赋予类有访问别的类的私有权限

  友元类的申明

class Building
{//申明GoodF为Building的友元类friend class GoodF;friend class GoodF2;
private:string woshi;
public:string keting;
public:Building(){keting = "客厅";woshi = "卧室";}
};

访问方式:

        1.通过传入参数来访问类的私有成员

class GoodF
{
public:void func(Building &bd){cout << "访问:" << bd.keting << endl;cout << "访问:" << bd.woshi << endl;}
};

        2.通过类内的指针来访问类的私有成员

class GoodF2
{
public:Building* pbu;
public:GoodF2(){pbu = new Building;}//拷贝构造GoodF2(const GoodF2& f2){pbu = new Building;}~GoodF2(){if (pbu != NULL){delete pbu;}}void func(){cout << "访问:" << pbu->keting << endl;cout << "访问:" << pbu->woshi << endl;}
};

类的成员函数变成友元函数

 注意:类的成员函数变成友元函数时,你得先声明类,然后成为友元函数的那个函数得加上作用域,如下所示:

class Building;//申明类,你这里不声明类在GoodGay里就会报错,//因为不知道Building& bud是否被定义class GoodGay
{
public:void func(Building& bud);
};class Building
{//申明GoodGay类的func函数成为友元函数//1.编译器知道类的声明,不知道类的结构friend void GoodGay::func(Building &bud);
private:string woshi;
public:string keting;
public:Building(){keting = "客厅";woshi = "卧室";}
};

 友元注意

  1. 友元关系不能被继承
  2. 友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友
  3. 友元关系不具有传递性,类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友

 单例模式

  定义:一个类只能实例化一个对象,叫做单例模式

  应用场景:有一些对象只需要一个,如:对话框、系统日志、显卡等设备的驱动程序对象、一台PC连接一个键盘。

  让一个类变成单例模式的步骤:

        step1.把无参构造函数和拷贝构造函数私有化

class Maker
{
private:Maker(){}Maker(const Maker& m){}
};

        step2.定义一个类内的静态成员指针

class Maker
{
private:Maker(){}Maker(const Maker& m){}
private://2.定义一个类内的静态成员指针static Maker *pMaker;
};

        step3.在类外初始化时,new一个对象

class Maker
{
private:Maker(){}Maker(const Maker& m){}
private://2.定义一个类内的静态成员指针static Maker *pMaker;
};
Maker *Maker::pMaker=new Maker;

        step4.把指针权限设置为私有,并提供一个静态成员函数来访问静态成员变量

class Maker
{//1.把无参构造函数和拷贝构造函数私有化
private:Maker(){}Maker(const Maker& m){}
public://4.把指针权限设置为私有,并提供一个静态成员函数来访问静态成员变量static Maker* getMaker(){return pMaker;}
private://2.定义一个类内的静态成员指针static Maker *pMaker;
};
//3.在类外初始化时,new一个对象
Maker *Maker::pMaker = new Maker;

  单例模式的调用:

        在这里m和m2都是同一个对象,调用的都是同一个静态成员变量

void test()
{Maker* m = Maker::getMaker();Maker* m2 = Maker::getMaker();cout << m << endl;cout << m2 << endl;
}

更多推荐

Friend友元函数以及单例模式

本文发布于:2024-03-05 14:29:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712546.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   模式   Friend

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!