- friend关键字只出现在声明处
- 其他类、类成员函数、全局函数都可声明为友元
- 友元函数不是类的成员,不带this指针
- 友元函数可访问对象任意成员属性,包括私有属性
全局函数做友元函数
全局函数写到 类中做声明 并且前面加上关键字 friend
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
class Building
{
//让全局的好基友函数 变为我的好朋友 友元函数
friend void goodGay(Building * building);
//客厅 卧室
public:
Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
//全局函数 好基友
void goodGay(Building * building)
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
//友元函数 目的访问类中的私有成员属性
void test01()
{
Building * building = new Building;
goodGay(building);
}
int main(void)
{
test01();
system("pause");
return 0;
}
整个类做友元函数
friend class 类名
[友元类注意]
- 友元关系不能被继承。
- 友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。
友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
class Building
{
//让好基友类 作为Building的好朋友
friend class goodGay;
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
class goodGay
{
public:
goodGay();
void visit();
private:
Building *building;
};
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问" << this->building->m_SittingRoom << endl;
cout << "好基友正在访问" << this->building->m_BedRoom << endl;
}
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
void test01()
{
goodGay gg;
gg.visit();
}
int main()
{
test01();
system("pause");
return 0;
}
成员函数作为友元函数
friend void goodGay::visit();
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>
//只让visit可以做Building的好朋友 visit2不可以作为友元
class Building;
class goodGay
{
public:
goodGay();
void visit();
void visit2();
private:
Building *building;
};
class Building
{
//让成员函数visit 作为Building的友元
friend void goodGay::visit();
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问" << this->building->m_SittingRoom << endl;
cout << "好基友正在访问" << this->building->m_BedRoom << endl;
}
void goodGay::visit2()
{
cout << "好基友正在访问" << this->building->m_SittingRoom << endl;
cout << "好基友正在访问" << this->building->m_BedRoom << endl;
}
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
void test01()
{
goodGay gg;
gg.visit();
//gg.visit2(); 只能访问到m_SittingRoom
}
int main()
{
test01();
system("pause");
return 0;
}