孤身打马南屏旧桥边过,恰逢山雨来时雾蒙蒙。
友元的目的是使一个函数或者类访问另一个类的私有和保护成员。
友元可以为了使得程序中一些类外的函数或者类访问另一个类的私有属性。
友元有以下三种实现方式:
1.全局函数做友元;
2.类做友元;
3.成员函数做友元。
1.全局函数做友元
使用friend关键字在类中声明全局函数,使友元全局函数可以访问该类中的保护成员和私有成员。
#include <iostream>
#include <string>
using namespace std;
class Building
{
friend void visit(Building *building);//将全局函数visit作为Building的友元
public:
Building();
string m_settingroom;
private:
string m_bedroom;
};
Building::Building()
{
this->m_settingroom = "客厅";
this->m_bedroom = "卧室";
}
void visit(Building* m_building)
{
cout << "你的好友正在访问" << m_building->m_settingroom << endl;
cout << "你的好友正在访问" << m_building->m_bedroom << endl;
};
int main()
{
Building *building1 = new Building;
visit(building1);
system("pause");
return 0;
}
2.友元类
在类中使用friend关键字中声明友元类,使友元类可以访问该类中的私有和保护成员。
#include <iostream>
#include <string>
using namespace std;
class Building
{
friend class GoodFriend;//将GoodFriend类声明为Building类的友元
public:
Building();
~Building() {};
string m_settingroom;
private:
string m_bedroom;
};
Building::Building()
{
this->m_settingroom = "客厅";
this->m_bedroom = "卧室";
}
class GoodFriend
{
public:
Building* m_Building;
GoodFriend();
~GoodFriend() ;
void visit();
};
GoodFriend::GoodFriend()
{
m_Building = new Building;
}
GoodFriend::~GoodFriend()
{
delete m_Building;
}
void GoodFriend::visit()
{
cout << "你的好友正在访问" << m_Building->m_settingroom << endl;
cout << "你的好友正在访问" << m_Building->m_bedroom << endl;
}
void test()
{
GoodFriend gg;
gg.visit();
}
int main()
{
test();
system("pause");
return 0;
}
3.成员函数做友元
在类中使用friend关键字声明成员函数,使得友元成员函数可以访问该类中的保护和私有成员。
#include <iostream>
#include <string>
using namespace std;
class Building;//由于GoodFriend类中使用到Building类,提前声明。
class GoodFriend
{
public:
GoodFriend();
~GoodFriend();
void visit();//visit不可以访问Buliding类的私有成员
void visit2();//visit2可以访问Buliding类的私有成员
private:
Building* m_Building;
};
class Building
{
friend void GoodFriend::visit2();//将GoodFriend的成员函数visit2声明为Buliding类的友元
public:
Building();
~Building() {};
string m_settingroom;
private:
string m_bedroom;
};
Building::Building()
{
this->m_settingroom = "客厅";
this->m_bedroom = "卧室";
}
GoodFriend::GoodFriend()
{
m_Building = new Building;
}
GoodFriend::~GoodFriend()
{
delete m_Building;
}
void GoodFriend::visit()
{
cout << "你的好友正在访问" << m_Building->m_settingroom << endl;
}
void GoodFriend::visit2()
{
cout << "你的好友与你一起访问" << m_Building->m_settingroom << endl;
cout << "你的好友与你一起访问" << m_Building->m_bedroom << endl;
}
void test()
{
GoodFriend gg;
gg.visit();
gg.visit2();
}
int main()
{
test();
system("pause");
return 0;
}