实验:没加入自注意力机制反而效果更好,还得继续炼丹
友元
在程序里,有些私有属性也想让类外特殊的一些函数或类进行访问,就需要用到友元技术
有元的目的就是让一个函数或者类,访问另一个类中私有成员
友元的关键字是 :friend
三种属性: 全局函数做友元 类做友元 成员函数做友元
全局函数做友元
//建筑物类
class Building
{
public:
Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
public:
string m_SittingRoom;//客厅
private:
string m_BedRoom;
};
然后设置一个全局函数
void goodgay(Building *building)
{
cout << "好基友正在访问:" << building->m_SittingRoom << endl;
cout << "好基友正在访问:" << building->m_BedRoom << endl;
}
这段代码写好后会发现m_BedRoom会报错,因为这是私有属性,类外访问不到,因此需要将该全局函数做为友元,才可以访问类内私有的参数。在Building类中写下面这行代码,便可正常访问。
语法 :friend void goodgay(Building *building);
friend void goodgay(Building *building);
类做友元
使用类做友元 的时候学了新的东西,就是在类外去写成员函数,首先还是先定义两个类
class Building
{
public:
Building();
public:
string m_SittingRoom;//客厅
private:
string m_BedRoom;
};
class goodGay
{
public:
goodGay();
public:
void visit();//参观函数访问building中的属性
Building* building;
};
然后在类外定义成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
new Building这行代码会在堆区上动态分配内存,创建一个Building 对象,并调用 Building 类的构造函数。也就是说当实例化goodGay gg; 的时候,就会先调用该构造函数,然后执行到该构造函数的函数体中会创建一个Building这个类,并且调用该类的构造函数给该类的属性赋值。
void goodGay::visit()
{
cout << "好基友类正在访问:" << building->m_SittingRoom << endl;
cout << "好基友类正在访问:" << building->m_BedRoom << endl;
}
这时候还没将这个类做友元,所以在访问building的私有属性时还是会报错,我们只需将该类设置成友元即可。语法 :friend class goodGay;
class Building
{
//goodGay类是本类的好朋友,可以访问这个类的私有成员
friend class goodGay;
public:
Building();
public:
string m_SittingRoom;//客厅
private:
string m_BedRoom;
};
成员函数做友元
class Building;
class goodGay
{
public:
goodGay();
public:
void visit();//让visit可以访问building中私有成员
void visit2();//让visit2不可以访问building中私有成员
Building* building;
};
class Building
{
public:
Building();
public:
string m_SittingRoom;//客厅
private:
string m_BedRoom;
};
然后按照上面的知识点继续在类外构造成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "visit正在访问:" << building->m_SittingRoom << endl;
cout << "visit正在访问:" << building->m_BedRoom << endl;
}
void goodGay::visit2()
{
cout << "visit2正在访问:" << building->m_SittingRoom << endl;
//cout << "visit2正在访问:" << building->m_BedRoom << endl;
}
没设置友元的时候,visit和visit2都访问不到building的私有属性
所以我们要将visit函数设置成友元
friend void goodGay::visit();
即
class Building
{
friend void goodGay::visit();
public:
Building();
public:
string m_SittingRoom;//客厅
private:
string m_BedRoom;
};
语法:friend void goodGay::visit();
告诉编译器 goodGay类下的visit这个成员函数作为本类的友元,可以访问私有成员
炼丹炼丹,晚上继续学习,加油加油!