C/C++学习笔记九

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;
}

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/124456477