友元
0x00 Q&A
1.声明一个类不能被实例化?
2.声明一个类只能被指定的类使用?
3.声明一个类只能被指定的类或函数使用?
有时候,一个类A的私有数据就想被类B访问到,这时也要使用友元。
0x01 关于友元
友元就是声明朋友
友元分为友元类和友元函数。其中友元函数又可以分为友元成员函数和友元全局函数。
0x02 友元类
0x03 友元成员函数
class CFriend
{
public:
void fun1(); // 避免下面的友元函数报错,这里将实现写在下面
};
class CString
{
friend void CFriend::fun1(); // 友元成员函数
private:
CString()
{
}
~CString()
{
}
int Copy() {
return 0;
}
int Cat() {
return 0;
}
};
void CFriend::fun1()
{
// 声明为友元函数以后,可以访问类CString的所有成员,不论公有私有
CString str;
str.Copy();
}
0x04 友元全局函数
void ShowString();
class CString
{
friend void ShowString(); // 友元全局函数
private:
CString()
{
}
~CString()
{
}
int Copy() {
return 0;
}
int Cat() {
return 0;
}
};
void ShowString()
{
CString str;
str.Copy(); // 声明为友元函数后 str访问成员数据和方法不受访问权限限制
}
0x05 友元类可以不存在
class CFriend
{
public:
void fun1();
};
class CString
{
// 1.友元类可以不存在
friend class CFriend2; // 友元类 CFriend2 可以不存在
// 2.友元成员函数必须存在
//friend void CFriend::fun2(); // error C2039: "fun2": 不是 "CFriend" 的成员
// 3.友元全局函数可以不存在
friend void ShowString(); // 编译不会报错
friend int main(int argc, char* argv[]); // 友元全局函数
private:
CString() {
}
~CString() {
}
int Copy() {
return 0;
}
int Cat() {
return 0;
}
};
void CFriend::fun1()
{
}
int main(int argc, char* argv[])
{
CString str;
str.Copy();
return 0;
}