在 C++ 中,一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。现在,我们来介绍一种例外情况——友元(friend)。借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。
友元的目的 就是让一个函数或者类 访问另一个类中的私有成员
友元的关键字为 friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
1 全局函数做友元
class Building
{
//告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容
friend void goodGay(Building * building);
public:
Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
void goodGay(Building * building)
{
cout << "好基友正在访问: " << building->m_SittingRoom << endl;
cout << "好基友正在访问: " << building->m_BedRoom << endl;
}
void test01()
{
Building b;
goodGay(&b);
}
int main(){
test01();
system("pause");
return 0;
}
关键代码
friend void goodGay(Building * building);
building里面的卧室是私有的(private) 正常只能building类内自己访问 加上友元后 全局函数好基友void goodGay()也可以访问了
2 类做友元
class Building;
class goodGay
{
public:
goodGay();
void visit();
private:
Building *building;
};
class Building
{
//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
friend class goodGay;
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main(){
test01();
system("pause");
return 0;
}
关键代码:
friend class goodGay;
3 成员函数做友元
class Building;
class goodGay
{
public:
goodGay();
void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
void visit2();
private:
Building *building;
};
class Building
{
//告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
friend void goodGay::visit();
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void goodGay::visit2()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
//cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main(){
test01();
system("pause");
return 0;
}
关键代码:
//告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
friend void goodGay::visit();
友元机制破坏了C++中的封装特性。在一个类中,私有成员被设置为private是为了防止类外的对象直接访问它们。但是使用友元机制可以让类外的对象直接访问私有成员,因此友元机制也被认为是一种破坏了封装的特性。为了避免滥用友元机制破坏封装特性,我们需要对友元机制进行谨慎地处理和使用。
在使用友元机制时,需要注意以下几点:
1、友元机制应该只用于必要的情况。过多的友元声明会破坏封装和安全性,使得代码难以维护。
2、尽量避免对整个类进行友元声明。如果需要访问某个类的私有成员,应该尽量将它们封装成公有接口,而不是暴露私有成员。
3、友元关系不能被继承,也不能被传递。如果派生类想要访问其基类的私有成员,应该使用虚函数和保护成员函数的方式。
本文介绍了C++中友元的概念,包括全局函数、类和成员函数作为友元的三种方式,以及友元如何突破封装限制。作者强调了友元的谨慎使用和注意事项,以保持代码的安全性和可维护性。
1083

被折叠的 条评论
为什么被折叠?



