1、有些时候,一个完全无关的类由于某些特殊的原因需要访问某个protected成员,甚至某个private成员,这就引入了友元的概念;
2、友元关系是类之间的一种特殊关系,这种关系不仅允许友元类访问对方的public方法和属性,还允许友元访问对方的protected和private方法和属性;
3、声明一个友元关系的语法很简单,只要在类声明里的某个地方加上friend class **就行了,这条语句可以放在任何地方,放在public、protected、private段落里都可以;
样例:友元使用方法
#include <iostream>
#include <string>
// 友元用法示例
class Lovers
{
public:
Lovers(std::string theName);
void kiss(Lovers *lover);
void ask(Lovers *lover, std::string something);
protected:
std::string name;
friend class Others; // 交友不慎
};
Lovers::Lovers(std::string theName)
{
name = theName;
}
void Lovers::kiss(Lovers *lover)
{
std::cout << name << " Lovers::kiss() " << lover->name << std::endl;
}
void Lovers::ask(Lovers *lover, std::string something)
{
std::cout << name << " Lovers::ask() " << lover->name << something << std::endl;
}
class Boyfriend : public Lovers
{
public:
Boyfriend(std::string theName);
};
Boyfriend::Boyfriend(std::string theName) : Lovers(theName)
{
}
class Girlfriend : public Lovers
{
public:
Girlfriend(std::string theName);
};
Girlfriend::Girlfriend(std::string theName) : Lovers(theName)
{
}
class Others
{
public:
Others(std::string theName);
void kiss2(Lovers *lover);
protected:
std::string name;
};
Others::Others(std::string theName)
{
name = theName;
}
void Others::kiss2(Lovers *lover)
{
std::cout << name << " Others::kiss2() " << lover->name << std::endl;
}
int main()
{
Boyfriend boyfriend("BOY");
Girlfriend girlfriend("GIRL");
Others others("OTHER");
girlfriend.kiss(&boyfriend);
girlfriend.ask(&boyfriend, " Wash clothes.");
std::cout << "OTHER is coming." << std::endl;
others.kiss2(&girlfriend);
return 0;
}
输出:
GIRL Lovers::kiss() BOY
GIRL Lovers::ask() BOY Wash clothes.
OTHER is coming.
OTHER Others::kiss2() GIRL