4.4友元
客厅时(public)一般人能进,卧室(private)y一般人不能进
但是我是允许关系特别好的人进去;
想让类外特殊的一些函数或者类进行访问就需要用到友元
友元的目的就是让一个函数或者类访问另一个类中的私有成员。
友元关键字friend
友元三种实现:
-
全局函数做友元
#include<iostream> using namespace std; #include<string> //建筑物类 class building { //这里可以用&,*或者不写直接值传递 friend void goodguy(building building);//把全局函数作为友元 public: //无参构造函数 building() { m_sittingroom = "客厅"; m_badroom = "卧室"; } public: string m_sittingroom; private: string m_badroom; }; //全局函数 void goodguy(building building) { cout << "好朋友的全局函数正在访问" << building.m_sittingroom << endl; cout << "好朋友的全局函数正在访问" << building.m_badroom << endl; } void test02() { building p; goodguy(p); } int main() { test02(); system("pause"); return 0; }
-
类做友元
#include<iostream>
using namespace std;
#include<string>
class building{};//先声明有一个buildiing类2
class goodgay//用一个类做友元
{
public:
goodgay();//无参构造函数
void visit();//好朋友的行为
building* build;
};
class building
{
friend class goodgay;
public:
building();//无参构造函数
string m_sittingroom;
private:
string m_badroom;
};
//类外写成员函数
building::building()
{ //初始化building的属性值
m_sittingroom = "客厅";
m_badroom = "卧室";
}
goodgay::goodgay()
{
//创建建筑物
build = new building;//相当于在堆区创建一个building对象然后返回其地址(指针)
}
void goodgay::visit() {
cout << "好朋友正在访问:" << build->m_sittingroom << endl;
cout << "好朋友正在访问:" << build->m_badroom << endl;
}
void test01() {
//先创建一个好朋友
goodgay pp;//创建完好朋友的时候会调用goodgay的构造函数来创造一个建筑物
//建筑物创建时会调用building构造函数来给建筑物初始化;
pp.visit();
}
-
成员函数做友元
-
visit()要在类外面定义
-
Goodgay类要定义在Building前
-
这里GoodGay的构造函数必须要在类外声明,否则会出现使用未定义类的错误
-
综上所述只要函数内又包括其他类的操作就必须要把实现写在所有类的下面也就是写在全局区
#include<iostream>
using namespace std;
#include<string>
class building;//必须要声明这个类是存在的不然无法进行goodegay类的操作因为goodgay类中有building类的成员。否则会提示未定义。
//友元成员函数本身的类定义需要在声明该成员函数是友元的类之前,只声明的话是不成功的。因此goodgay必须写在building前面。
class goodgay{
public:
goodgay();
void visit1();
void visit2();
building * build;
};
class building
{
friend void goodgay::visit1();
public:
building();
private:
string bedroom;
public:
string sittingroom;
};
building::building() {
sittingroom = "客厅";
bedroom = "卧室";
}
goodgay::goodgay() //友元类的构造函数必须放在全局,而且要在后一个类的后面:注意,类外写函数的时候一定要写在用到的类的定义的后面,否则会提示未定义!
{
this->build = new building;//这里不用this指针也可以
}
void goodgay::visit1() {
cout << "goodgay正在访问:" << build->sittingroom<< endl;
cout << "goodgay正在访问:" << build->bedroom<< endl;
}
void goodgay::visit2() {
cout << "goodgay正在访问:" << build->sittingroom << endl;
//cout << "goodgay正在访问:" << build->bedroom << endl;
}
void test01() {
goodgay p;
p.visit1();
//p.visit2();
}
int main() {
test01();
system("pause");
return 0;
}