友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员
特点
友元函数是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。 友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。
注意事项
(1) 友元关系不能被继承。 (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
友元三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元
#include <iostream>
#include <ctime>
#include <string>//c++中字符串需要添加这个头文件
#include <fstream>
#include <stdio.h>
using namespace std;
class Building
{
friend void goodgay(Building & build);
public:
string sroom;
Building()
{
sroom = "客厅";
mroom = "卧室";
}
private:
string mroom;
};
void goodgay(Building & build)
{
std::cout << build.sroom << endl;
std::cout << build.mroom << endl;
}
int main()
{
Building building;
goodgay(building);
return 0;
}
类做友元
#include <iostream>
#include <ctime>
#include <string>//c++中字符串需要添加这个头文件
#include <fstream>
#include <stdio.h>
using namespace std;
class Building;
class GoodGay
{
public:
GoodGay();
void visit();
Building *build;
};
class Building
{
friend class GoodGay;
public:
string sroom;
Building();
private:
string mroom;
};
GoodGay::GoodGay()
{
build = new Building;
}
Building::Building()
{
sroom = "客厅";
mroom = "卧室";
}
void GoodGay::visit()
{
cout << "好基友正在访问" << build->sroom << endl;
cout << "好基友正在访问" << build->mroom << endl;
}
int main()
{
GoodGay goodgay;
goodgay.visit();
return 0;
}
成员函数做友元
#include <iostream>
#include <ctime>
#include <string>//c++中字符串需要添加这个头文件
#include <fstream>
#include <stdio.h>
using namespace std;
class Building;
class GoodGay
{
public:
GoodGay();
void visit();
void visit1();
Building *build;
};
class Building
{
friend void GoodGay::visit1();
public:
string sroom;
Building();
private:
string mroom;
};
GoodGay::GoodGay()
{
build = new Building;
}
Building::Building()
{
sroom = "客厅";
mroom = "卧室";
}
void GoodGay::visit()
{
cout << "好基友正在访问" << build->sroom << endl;
/*cout << "好基友正在访问" << build->mroom << endl;*/
}
void GoodGay::visit1()
{
cout << "好基友正在访问" << build->sroom << endl;
cout << "好基友正在访问" << build->mroom << endl;
}
int main()
{
GoodGay goodgay;
goodgay.visit();
goodgay.visit1();
return 0;
}