0x00 Q&A
1.声明一个类不能被实例化?
将构造函数私有
2.声明一个类只能被指定的类使用?
私有内部类
3.声明一个类只能被指定的类或函数使用?
友元
有时候,一个类A的私有数据就想被类B访问到,这时也要使用友元。
0x01 关于友元
友元就是声明朋友
友元不受访问控制权限限制。
友元分为友元类和友元函数。其中友元函数又可以分为友元成员函数和友元全局函数。
0x02 友元类
友元类:一个类A声明类B是友元类,则类B中的所有成员函数都可以访问类A的所有成员(公有和私有)。
0x03 友元成员函数
友元成员函数:一个类A声明类B中的函数func是友元函数,则类B中的函数func可以访问类A的所有成员(公有和私有)。
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 友元全局函数
友元全局函数:一个类A声明全局函数func是友元函数,则全局函数func可以访问类A的所有成员(公有和私有)。
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;
}