在C++中,一个全局方法或者一个类,或者一个类的成会员方法被在另一个类中声明为友元,那么这个方法或类就可以访问另一个类中的私有成员.
1,一个全局方法被一个类声明为友元.
#include <iostream>
using namespace std;
//声明一个矩形
class Rect
{
private:
int m_width;
int m_length;
public:
Rect(int width,int length):m_width(width),m_length(length){
}
int getLength(){
return m_length;
}
int getWidth(){
return m_width;
}
//如果注释掉下边这行,则编译过程提示错误,
/* 此文件名为friend.cpp
friend.cpp: In function `int ComputerArea(Rect&)':
friend.cpp:8: error: `int Rect::m_width' is private
friend.cpp:24: error: within this context
friend.cpp:9: error: `int Rect::m_length' is private
friend.cpp:24: error: within this context
*/
friend int ComputerArea(Rect& rect);
};
int ComputerArea(Rect& rect)
{
return rect.m_width*rect.m_length;
}
int main()
{
Rect rect(2,3);
cout << "面积等于:" << ComputerArea(rect) << endl;
return 0;
}
2,一个类的成员方法被另一个类声明为友元
#include <iostream>
#include <cstring>
using namespace std;
class CItem;
class CList
{
private:
CItem * m_pItem;
public:
CList();
~CList();
void OutPutItem();
};
class CItem
{
friend void CList::OutPutItem();
private:
char m_name[128];
void OutPutName(){
cout << m_name << endl;
}
public:
CItem(){memset(m_name,0,128);}
void SetName(const char* pData){
if(pData!=NULL){
strcpy(m_name,pData);
}
}
};
//由于void CList::OutPutItem() 被声明为CItem的友元方法,此方法可以访问CItem的任何成员.
void CList::OutPutItem(){
m_pItem->SetName("将类的成员方法声明为另一个类的友元方法,此方法可以肆无忌惮访问另一个类的数据成员");
m_pItem->OutPutName();
}
CList::CList(){
m_pItem=new CItem();
}
CList::~CList(){delete m_pItem; m_pItem=NULL;}
int main()
{
CList list;
list.OutPutItem();
return 0;
}
3,一个类被声明为另一个类的友元类
#include <iostream>
using namespace std;
class Rect
{
private:
int m_width;
int m_length;
public:
Rect(){}
Rect(int width,int length):m_width(width),m_length(length){
}
int getLength(){
return m_length;
}
int getWidth(){
return m_width;
}
friend int ComputerArea(Rect& rect);
friend class B;
/* 如果不声明为友元类,则会有下边的编译错误
D:\>g++ friend.cpp -omain
friend.cpp: In constructor `B::B()':
friend.cpp:7: error: `int Rect::m_width' is private
friend.cpp:34: error: within this context
friend.cpp:8: error: `int Rect::m_length' is private
friend.cpp:35: error: within this context
friend.cpp: In member function `void B::PrintArea()':
friend.cpp:7: error: `int Rect::m_width' is private
friend.cpp:38: error: within this context
friend.cpp:8: error: `int Rect::m_length' is private
friend.cpp:38: error: within this context
*/
};
int ComputerArea(Rect& rect)
{
return rect.m_width*rect.m_length;
}
class B
{
private:
Rect rect;
public:
B(){
rect.m_width=12;
rect.m_length=12;
}
void PrintArea(){
cout <<"面积等于:" << rect.m_width*rect.m_length<< endl;
}
};
int main()
{
Rect rect(2,3);
cout << "面积等于:" << ComputerArea(rect) << endl;
//被声明为友元类之后,该类中的方法可以肆无忌惮的操作rect类的私有成员.
B b;
b.PrintArea();
return 0;
}