友元的目的就是让一个函数或者类访问另一个私有成员
使用友元——friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
1.全局函数做友元
使用一个全局函数去访问类的私有成员
方法:在类1大括号内写入“friend 函数声明”,则函数就是类1的友元,此函数可以访问类1的私有成员
2.类做友元
方法:在类1的大括号内加入“friend class 类名”,则此类就是类1的友元,可以访问类1的私有成员;
#include<iostream>
using namespace std;
#include<string>
class Building;//由于Goodfriend类中有一个Building,所以要提前写上说明后面有创建一个Building类
class Goodfriend
{
public:
Goodfriend();
void visit();//参观函数,访问Building的属性
Building* building;
};
class Building
{
friend class Goodfriend;//关键在于这一行,加入此行则将Goodfriend类成为Building类的友元,可以访问此类中的所有成员
public:
string m_SittingRoom;
Building();
private:
string m_BedRoom;
};
//类外写成员函数,不要忘记加作用域
Goodfriend::Goodfriend()
{
//创建出一个建筑物的对象
building = new Building;//在堆区创建一个新的对象,并令building这个指针指向这个new出的对象
//C++中声明一个对象指针时没有分配内存,不会调用构造函数
}
void Goodfriend::visit()
{
cout << "Goodfriend is visiting:" << building->m_SittingRoom << endl;//公共成员可以访问
cout << "Goodfriend is visiting:" << building->m_BedRoom << endl;//私有成员访问需要依靠友元
//需要注意两个语句的条件
}
//类Building中函数的实现
Building::Building()
{
m_SittingRoom = "SittingRoom";
m_BedRoom = "BedRoom";
}
//test
void test01()
{
Goodfriend g;//实例化对象
g.visit();
}
int main()
{
test01();
return 0;
}
3.成员函数做友元
方法:在类1大括号内写入“friend 类2::函数声明”,则类二中的成员函数就是类1的友元,此函数可以访问类1的私有成员
#include<iostream>
using namespace std;
#include<string>
class Building;
//在这里 为了building能访问goodgay的成员函数,所以先写的goodgay类
//但是goodgay又需要访问building类,所以只能在前面加上building的声明(前置声明)
class Goodfriend
{
public:
Goodfriend();
void visit();//让visit访问building中私有成员
void visit2();//让visit2不可以访问building中私有成员
Building* building;
};
class Building
{
friend void Goodfriend::visit();//在声明前加friend,并且加上作用域(两个步骤)
public:
Building();
string m_SittingRoom;
private:
string m_BedRoom;
};
//类外实现成员函数
Goodfriend::Goodfriend()
{
building = new Building;
}
void Goodfriend::visit()
{
cout << "Goodfriend(v1) is visiting:" << building->m_SittingRoom << endl;
cout << "Goodfriend(v1) is visiting:" << building->m_BedRoom <<endl;
}
void Goodfriend::visit2()
{
//cout << "Goodfriend(v2) is visiting:" << building->m_BedRoom <<endl;
//上方这行代码取消注释后无法实现,因为此函数不是Building类的友元
cout << "Goodfriend(v2) is visiting:" << building->m_SittingRoom << endl;
}
Building::Building()
{
m_SittingRoom = "SittingRoom";
m_BedRoom = "BedRoom";
}
int main()
{
Goodfriend g;
g.visit();
g.visit2();
return 0;
}