在c++中,友元有三种实现方式:全局函数做友元;类做友元;成员函数做友元;
友元就是给某些类或者函数提高一种权限去访问到你想去访问类的属性。就是你的卧室一般只有好朋友才可以进去一样。C++面向真实世界对象,抽象出的程序设计思想。
1、全局函数做友元
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);
//房子类
class House
{
//全局函数做友元
friend void Goodfriend(House * h);
public :
House()
{
this->Bedroom="卧室";
this->Livingroom="客厅";
}
private :
string Bedroom;//卧室,私有属性,类外无法访问
public :
string Livingroom;//客厅,公有属性,类外可以访问
};
//全局友元函数
void Goodfriend(House * h)
{
cout<<"your friends are visiting your "<< h->Bedroom<<endl;
cout<<"your friends are visiting your "<< h->Livingroom<<endl;
}
2、类做友元
:
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
** friend class 类名;**
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
class Goodgay;
class Building
{
friend Goodgay;
public :
Building();
private :
string Bedroom;//卧室,私有属性,类外无法访问
public :
string Livingroom;//客厅,公有属性,类外可以访问
};
class Goodgay
{
public :
void visit();//类外进行初始化函数体
Goodgay();
~Goodgay()
{
cout<<"析构函数已经调用"<<endl;
if(building!=NULL)
{
delete building;
building=NULL;
}
}
private :
Building * building;//Building 指针
};
//Goodgay作用域下面的参观函数,对Building属性进行参观处理
void Goodgay::visit()
{
cout<<"your friends are visiting your "<< building->Bedroom<<endl;
cout<<"your friends are visiting your "<< building->Livingroom<<endl;
}
//Goodgay的构造函数进行开辟Building的指针,指向Building类
Goodgay::Goodgay()
{
building=new Building;
}
//Building作用域下面的构造函数,对其属性进行初始化
Building::Building()
{
this->Bedroom="卧室";
this->Livingroom="客厅";
}
3、成员函数做友元
使用类中的某个函数作为友元。基本过程与全局函数类似。格式如下
** friend class(类名)::成员函数**
//成员函数作为友元
class My_Building;
class My_Goodgay
{
public :
void visit1();//visit1函数作为友元函数
void visit2();//visit2作为普通函数
My_Goodgay();
private :
My_Building * my_building;//Building 指针
};
class My_Building
{
friend void My_Goodgay::visit1();
public :
My_Building();
private :
string Bedroom;//卧室,私有属性,类外无法访问
public :
string Livingroom;//客厅,公有属性,类外可以访问
};
//Goodgay作用域下面的参观函数,对Building属性进行参观处理
void My_Goodgay::visit1()
{
cout<<"your friends are visiting your "<< my_building->Bedroom<<endl;
cout<<"your friends are visiting your "<< my_building->Livingroom<<endl;
}
void My_Goodgay::visit2()
{
//cout<<"your friends are visiting your "<< my_building->Bedroom<<endl;
cout<<"your friends are visiting your "<< my_building->Livingroom<<endl;
}
//Building作用域下面的构造函数,对其属性进行初始化
My_Building::My_Building()
{
this->Bedroom="卧室";
this->Livingroom="客厅";
}
//Goodgay的构造函数进行开辟Building的指针,指向Building类
My_Goodgay::My_Goodgay()
{
my_building=new My_Building;
}
4、测试结果
void test1()
{
House a;
Goodfriend(&a);
}
void test2()
{
Goodgay gg;
gg.visit();
}
void test3()
{
My_Goodgay ggg;
ggg.visit1();
ggg.visit2();
}
int main()
{
test1();
cout<<"类做友元的例子"<<endl;
test2();
cout<<"成员函数做友元"<<endl;
test3();
return 0;
}