函数以及单例模式"/>
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 = "卧室";}
};
友元注意
- 友元关系不能被继承
- 友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友
- 友元关系不具有传递性,类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友元函数以及单例模式
发布评论