关键字为friend,友元的目的就是让一个函数 和 类 可以访问另一个类中的私有成员。
具体做法为在类中做一个声明,不用写在权限里都行。以下为友元的三种实现方式:
- 全局函数做友元
- 类做友元
- 成员函数做友元
一、全局函数做友元
class Home
{
//函数goodfriend是home类的友元,可以访问私有成员
friend void goodfriend(Home* home);
public:
string m_sittingroom; //客厅(公开的)
private:
string m_bedroom; //卧室(私有的)
public:
Home()
{
this->m_sittingroom = "客厅";
this->m_bedroom = "卧室";
}
};
首先先建一个Home
类,其中m_bedroom
是私有属性。因此接下来,全局函数goodfriend
如果要访问m_bedroom
,则需要在Home
类中做一个声明,不用写在权限里都行。(一般写在类的定义首行)
接下来全局函数goodfriend
才能正常访问到m_bedroom
,如下代码所示home->m_bedroom
。
void goodfriend(Home* home)
{
cout << "好朋友 全局函数正在访问: " << home->m_sittingroom << endl;
cout << "好朋友 全局函数正在访问: " << home->m_bedroom << endl;
}
void test01()
{
Home m_home;
goodfriend(&m_home);
}
二、类做友元
class Home
{
//类goodfriend是Home类的友元,可以访问私有成员
friend class goodfriend;
public:
string m_SittingRoom; //客厅(公开的)
private:
string m_BedRoom; //卧室(私有的)
public:
Home();//类外写
};
接下来要使得goodfriend
类成为Home
类的友元,因此需要在Home
类的首行加上friend class goodfriend;
。接下来goodfriend
类的visit
函数可以访问Home
中的私有属性。
class goodfriend
{
public:
goodfriend();//类外写
public:
void visit(); //参观函数,访问Home中的属性
Home* m_home;
};
这里我们顺便学习一下在类外写成员函数。需要注意的是,要在函数名前面 加上成员函数的所属类,如下Home::Home()
, goodfriend::goodfriend()
,void goodfriend::visit()
。
//类外写成员函数
Home::Home()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodfriend::goodfriend()
{
//创建一个Home的对象
m_home = new Home;
}
void goodfriend::visit()
{
cout << "好朋友 类正在访问: " << m_home->m_SittingRoom << endl;
cout << "好朋友 类正在访问: " << m_home->m_BedRoom << endl;
}
当goodfriend
类成为Home
类的友元之后,函数visit
中的m_home->m_BedRoom
就可以正常访问了。
void test01()
{
goodfriend gf1;
gf1.visit();
}
三、成员函数做友元
这一次我们打算让函数visit
可以访问Home中的私有成员,而函数visit2
不行。
class Home;
【注意】此处要先声明Home
类,然后定义goodfriend
类,再定义Home
类。否则如果先定义Home
类,则进行友元声明时friend void goodfriend::visit();
,无法识别goodfriend::visit
,因为此时还没有定义goodfriend
类,会报错。
class goodfriend
{
public:
goodfriend();
public:
void visit(); //使其可以访问Home中的私有成员
void visit2(); //使其不可以访问Home中的私有成员
Home* m_home;
};
下面我们在Home
类中声明了goodfriend
类中的函数visit
是友元。
class Home
{
friend void goodfriend::visit();
public:
string m_SittingRoom; //客厅(公开的)
private:
string m_BedRoom; //卧室(私有的)
public:
Home();
};
类外写成员函数,此处为类的无参构造函数
Home::Home()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodfriend::goodfriend()
{
//创建一个Home的对象
m_home = new Home;
}
此时只有友元函数visit
可以访问m_BedRoom
,而非友元函数的visit2
则不可以访问。
void goodfriend::visit()
{
cout << "visit函数正在访问: " << m_home->m_SittingRoom << endl;
cout << "visit函数正在访问: " << m_home->m_BedRoom << endl;
}
void goodfriend::visit2()
{
cout << "visit2函数正在访问: " << m_home->m_SittingRoom << endl;
}
下面我们建一个goodfriend
类的对象gf1
。
void test01()
{
goodfriend gf1;
gf1.visit();
gf1.visit2();
}