友元
自己的卧室只能自己访问,亲戚来了不允许进入,但是可以让好朋友进去。(解决方法:友元函数)
可以把一个全局函数声明为一个友元,可以把某个类的成员函数声明为一个友元,甚至可以将整个类声明为友元。
全局函数作友元
class Building
{
public:
Building()
{
this->m_sittingroom = "客厅";
this->m_bedroom = "卧室";
}
public:
string m_sittingroom;//客厅
private:
string m_bedroom;//卧室(只能类内访问)
};
//可以设置友元,将一个全局函数设置成友元,可以访问到Buiding的私有属性。
void goodGay(Building* building)
{
cout << "好基友正在访问:" << building->m_sittingroom << endl;
//cout << "好基友正在访问:" << building->m_bedroom << endl;
}
int main()
{
Building building;
goodGay(&building);
}
创建了对象(我的家),然后调用好朋友的函数,将对象的地址传进去,然后正常的访问客厅。但是这个函数是不能调我的家这个对象的卧室的,因为这个卧室是private的,只能类内用,但是如果将好朋友的函数改成友元,那么就能够访问了。
(直接在我的家的类中改)
class Building
{
friend void goodGay(Building* building);
//...
}
这样这个全局函数就可访问类中的私有成员变量了,相当于给这个全局函数设置了友元。
这也是在类外,除了类中的接口之外,能访问到私有成员变量的方法。
类作友元
class Building
{
public:
Building();
string m_sittingroom;
private:
string m_bedroom;
};
//这里来额外介绍下类中的函数怎么在类外进行定义:
//只需要将访问约定好就行
Building::Building()
{
this->m_bedroom = "卧室";
this->m_sittingroom = "客厅";
}
class GoodGay
{
public :
GoodGay()//构造函数
{
this->m_building = new Building;//在构造函数中创建了个房间,并且让指针维护这个房间。
}
void visit()//访问的动作
{
cout << "好基友正在访问:" << this->m_building->m_sittingroom << endl;
//cout << "好基友正在访问:" << this->m_building->m_bedroom << endl;
}
Building* m_building;//访问的对象的指针
};
int main()
{
GoodGay gg;
gg.visit();
return 0;
}
首先会创建一个好基友的对象gg,同时会调用自己的默认构造:默认构造中创建了一个building,然后再调用visit函数就可以访问building中的客厅了。但是不能访问building中的卧室(private权限)。在Building中作更改:
class Building
{
friend class GoodGay;
public:
Building();
string m_sittingroom;
private:
string m_bedroom;
};
这个友元必须声明,没有互逆的概念。
类中成员函数作友元
用上面的案例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>
class Building
{
public:
Building();
string m_sittingroom;
private:
string m_bedroom;
};
//这里来额外介绍下类中的函数怎么在类外进行定义:
//只需要将访问约定好就行
Building::Building()
{
this->m_bedroom = "卧室";
this->m_sittingroom = "客厅";
}
class GoodGay
{
public :
GoodGay()//构造函数
{
this->m_building = new Building;//在构造函数中创建了个房间,并且让指针维护这个房间。
}
void visit() //visit可以让这个函数访问到buidiling中的私有
{
cout << "好基友正在访问:" << this->m_building->m_sittingroom << endl;
//cout << "好基友正在访问:" << this->m_building->m_bedroom << endl;
}
void visit2()//不让这个函数访问到building中的私有
{
cout << "好基友正在访问:" << this->m_building->m_sittingroom << endl;
//cout << "好基友正在访问:" << this->m_building->m_bedroom << endl;
}
Building* m_building;
};
int main()
{
GoodGay gg;
gg.visit();
return 0;
}
想要使GoodGay中的visit()函数可以访问到building中的私有变量,不想使GoodGay中的visit2()函数访问到building中的私有变量。
作更改:
class Building
{
friend void GoodGay::visit();
public:
Building();
string m_sittingroom;
private:
string m_bedroom;
};
这样就能访问了。
但是我的编译器好像出了点问题,显示GoodGay不是类或者命名空间,听莫名其妙的,最后也没有解决掉。