生活中你的家有客厅(public),有你的卧室(private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你自己能进去
但是呢,你也可以允许你的好友进去
在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术
友元的目的就是让一个函数或者类访问另一个类中的私有成员
友元的关键字为:friend
友元的三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元
示例1:全局函数做友元
结果:#include <iostream>
using namespace std;
class Building
{
friend void building(Building* build); //友元全局函数的声明
public:
Building()
{
sittingroom = "客厅";
bedroom = "卧室";
}
string sittingroom;
private:
string bedroom; //private成员变量
};
void building(Building *build) //全局函数
{
cout << "好基友正在访问:" << build->sittingroom << endl;
cout << "好基友正在访问:" << build->bedroom << endl; //访问building类内private成员变量
}
int main()
{
Building b;
building(&b);
system("pause");
}
示例2:类做友元
结果:#include <iostream> using namespace std; class Building { friend class Goodgay; //类做友元的实现方式: friend class 友元类名 public: Building() { this->sittingroom = "客厅"; //为成员变量赋值 this->bedroom = "卧室"; //为成员变量赋值 } string sittingroom; private: //私有的成员变量 string bedroom; }; class Goodgay //构建Goodgay类 { public: Building* building; //构建Building类的一个指针去接收Building在栈上开辟的空间 Goodgay() { building = new Building; //在栈上开辟一个Building类的空间 } void Visit() { cout << "好基友正在访问:" << building->sittingroom << endl; //访问public成员变量 cout << "好基友正在访问:" << building->bedroom << endl; //访问private成员变量 } }; int main() { Goodgay gg; gg.Visit(); system("pause"); }
示例3:成员函数做友元
结果:#include <iostream> using namespace std; class Building; class Goodgay { public: Goodgay(); void visit(); void visit2(); Building* building; }; class Building { friend void Goodgay::visit2(); public: Building(); string m_Sittingroom; private: string m_Bedroom; }; Building::Building() { m_Sittingroom = "客厅"; m_Bedroom = "卧室"; } Goodgay::Goodgay() { building = new Building; } void Goodgay::visit() { cout << "visit函数正在访问:" << building->m_Sittingroom << endl; } void Goodgay::visit2() { cout << "visit函数正在访问:" << building->m_Bedroom << endl; } int main() { Goodgay g; g.visit(); g.visit2(); system("pause"); }
下边的代码有问题,暂未找到问题所在,需要改动!
原因找到:Goodgay已经引用了Building,然后在Building又做了引用声明,属于互相引用,所以产生错误! ```cppinclude
using namespace std; class Building {
friend void Goodgay::visit(); //Goodgay成员函数visit()访问Building下的private私有成员变量的声明 public: Building() {
} string sittingroom; private: string bedroom; };this->sittingroom = "客厅"; this->bedroom = "卧室";
class Goodgay { public: Building* building; Goodgay() { building = new Building; } void visit() { cout << “好基友正在访问:” << building->sittingroom << endl; cout << “好基友正在访问:” << building->bedroom << endl; } }; int main() { Goodgay gg; gg.visit(); system(“pause”); } ```