1、友元函数
友元函数提供了一种机制,使得在函数中能够访问类的私有数据成员和方法。
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
class CUser //定义一个类
{
private: //设置成员访问级别
char m_Username[128]; //定义数据成员
char m_Password[128]; //定义数据成员
int m_nLevel; //操作员级别
public:
CUser() //默认构造函数
{
m_nLevel = 1;
strcpy(m_Username, "MR"); //为数据成员赋值
strcpy(m_Password, "KJ"); //为数据成员赋值
cout << "构造函数被调用!" << endl; //输出信息
}
friend void OutputInfo(CUser & refUser); //声明友元函数
};
void OutputInfo(CUser & refUser)
{
cout << "用户级别: " << refUser.m_nLevel << endl; //访问私有数据成员
}
int main(int argc, char* argv[])
{
CUser User; //定义CUser对象
OutputInfo(User); //调用OutputInfo函数访问私有成员m_nLevel
return 0;
}
2、友元方法
友元函数不仅可以是一个全局函数,还可以是另一个类的成员函数。
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
class CUser; //前导声明CUser类
class CManage //定义CManage类
{
public:
void OutputUser(CUser* pUser); //定义一个公有方法
};
class CUser //定义一个CUser类
{
private: //设置成员访问级别
char m_Username[128]; //定义数据成员
char m_Password[128]; //定义数据成员
int m_nLevel; //操作员级别
public:
CUser() //默认构造函数
{
m_nLevel = 1;
strcpy(m_Username, "MR"); //为数据成员赋值
strcpy(m_Password, "KJ"); //为数据成员赋值
cout << "构造函数被调用!" << endl; //输出信息
}
friend void CManage::OutputUser(CUser* pUser); //声明友元函数
};
void CManage:: OutputUser(CUser* pUser) // OutputUser方法的实现
{
cout << "用户级别: " << pUser->m_nLevel << endl; //访问私有数据成员m_nLevel
}
int main(int argc, char* argv[])
{
CUser User; //定义CUser对象
CManage Manage; //定义CManage对象
Manage.OutputUser(&User); //调用OutputUser方法
return 0;
}
3、友元类
类CUser将CManage定义为自己的友元类,因此在CManage中的所有方法都可以访问CUser类的私有成员。
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
class CUser; //前导声明CUser类
class CManage //定义CManage类
{
public:
void OutputUser(CUser* pUser); //声明OutputUser方法
};
class CUser //定义一个类
{
private: //设置成员访问级别
char m_Username[128]; //定义数据成员
char m_Password[128]; //定义数据成员
int m_nLevel; //操作员级别
public:
CUser() //默认构造函数
{
m_nLevel = 1;
strcpy(m_Username, "MR"); //为数据成员赋值
strcpy(m_Password, "KJ"); //为数据成员赋值
cout << "构造函数被调用!" << endl; //输出信息
}
friend class CManage; //将CManage定义为自己的友元类
};
void CManage:: OutputUser(CUser* pUser) //定义OutputUser方法
{
cout << "用户级别: " << pUser->m_nLevel << endl;
}
int main(int argc, char* argv[])
{
CUser User; //定义CUser对象
CManage Manage; //定义CManage对象
Manage.OutputUser(&User); //调用CManage对象的OutputUser方法
return 0;
}
4、嵌套类
在类的内部在定义一个类。
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
#define MAXLEN 128 //定义一个宏
class CList //定义CList类
{
public: //嵌套类为公有的
class CNode //定义嵌套类CNode
{
friend class CList; //将CList类作为自己的友元类
private:
int m_nTag; //定义私有成员
public:
char m_Name[MAXLEN]; //定义公有数据成员
void OutputNode() //定义公有方法
{
cout << m_Name << endl;
}
}; //CNode类定义结束
public:
CNode m_Node; //定义一个CNode类型数据成员
void SetNodeName(const char *pchData) //定义成员函数
{
if (pchData != NULL) //判断指针是否为空
{
strcpy(m_Node.m_Name, pchData); //访问CNode类的共有数据
}
}
void SetNodeTag(int nTag) //定义成员函数
{
m_Node.m_nTag = nTag; //访问CNode类的私有数据
}
};
int main(int argc, char* argv[])
{
CList::CNode node; //合法的定义
return 0;
}
5、私有嵌套类
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
#define MAXLEN 128 //定义一个宏
class CList //定义CList类
{
private: //嵌套类为公有的
class CNode //定义私有嵌套类CNode
{
friend class CList; //将CList类作为自己的友元类
private:
int m_nTag; //定义私有成员
public:
char m_Name[MAXLEN]; //定义公有数据成员
void OutputNode() //定义公有方法
{
cout << m_Name << endl;
}
}; //CNode类定义结束
public:
CNode m_Node; //定义一个CNode类型数据成员
void SetNodeName(const char *pchData) //定义成员函数
{
if (pchData != NULL) //判断指针是否为空
{
strcpy(m_Node.m_Name, pchData); //访问CNode类的共有数据
}
}
void SetNodeTag(int nTag) //定义成员函数
{
m_Node.m_nTag = nTag; //访问CNode类的私有数据
}
};
int main(int argc, char* argv[])
{
//CList::CNode node; //错误的语句,不能访问私有嵌套类
return 0;
}