文章内容转载自黑马程序员C++核心编程讲义,如有侵权,请联系作者删除


4.4 友元

生活中你的家有客厅(Public),有你的卧室(Private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

但是呢,你也可以允许你的好闺蜜好基友进去。

在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术

友元的目的就是让一个函数或者类 访问另一个类中私有成员

友元的关键字为 ==friend==

友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

4.4.1 全局函数做友元

class Building
{
//告诉编译器 goodGay全局函数 是 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 b;
goodGay(&b);
}

int main(){

test01();

system("pause");
return 0;
}

自己写的:

#include<iostream>
using namespace std;
class Building {
//goodGay全局函数是Building的友元,可以访问Builing中的私有成员
friend void goodGay(Building* building);
public:
Building(){
m_livingroom = "客厅";
m_bedroom = "卧室";
}
public:
string m_livingroom;
private:
string m_bedroom;

};
//全局函数
void goodGay(Building *building) {
cout << "全局函数正在访问:" << building->m_livingroom << endl;

//cout << "全局函数正在访问:" << building->m_bedroom << endl;//报错,类外不可以访问
//解决方法:在类内的最上面添加函数的声明
cout << "全局函数正在访问:" << building->m_bedroom << endl;
}
void test01() {//公共属性,类外可以访问
Building building;
goodGay(&building);
}


int main() {
test01();
return 0;
}

4.4.2 类做友元

class Building;
class goodGay
{
public:

goodGay();
void visit();

private:
Building *building;
};


class Building
{
//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
friend class goodGay;

public:
Building();

public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};

Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}

goodGay::goodGay()
{
building = new Building;
}

void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}

void test01()
{
goodGay gg;
gg.visit();

}

int main(){

test01();

system("pause");
return 0;
}

自己写的:

#include<iostream>
using namespace std;
class Building;
class GoodGay {
public:
GoodGay();
void visit();//参观函数 访问类中的属性

Building* building;
};
class Building {
//GoodGay类是该类的友元,可以访问本类中的私有成员
friend class GoodGay;
public:
Building();
public:
string m_livingRoom;

private:
string m_bedRoom;
};
//类外实现成员函数
Building::Building() {//加上::,说明作用域
m_livingRoom = "客厅";
m_bedRoom = "卧室";
}

GoodGay::GoodGay() {
//创建建筑物对象
building = new Building;//在堆区开创建一个新的对象,并让Building* building;指向这个新的对象
}

void GoodGay::visit() {//GoodGay::说明作用域
cout << "好基友正在访问" << building->m_livingRoom << endl;

cout << "好基友正在访问" << building->m_bedRoom << endl;
}
void test01() {
GoodGay ss;//先调用GoodGay的构造函数,创建一个Building,同时会调用Building的构造函数
ss.visit();//调用visit函数,访问builing中的livingRoom
}
int main() {
test01();
return 0;
}

4.4.3 成员函数做友元

class Building;
class goodGay
{
public:

goodGay();
void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
void visit2();

private:
Building *building;
};


class Building
{
//告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
friend void goodGay::visit();

public:
Building();

public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};

Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}

goodGay::goodGay()
{
building = new Building;
}

void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}

void goodGay::visit2()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
//cout << "好基友正在访问" << building->m_BedRoom << endl;
}

void test01()
{
goodGay gg;
gg.visit();

}

int main(){

test01();

system("pause");
return 0;
}

自己写的:

#include<iostream>
using namespace std;
class Building;
class GoodGay {
public:
GoodGay();

void visit();//让visit函数可以访问Builing中的私有成员

void visit2();//让visit2函数不可以访问Builing中的私有成员

Building* building;
};

class Building {
//告诉编译器 GoodGay类下的visit成员函数作为本类的友元,可以访问私有成员
friend void GoodGay::visit();//注意需要添加GoodGay::来说明作用域
public:
Building();
public:
string m_livingRoom;
private:
string m_bedRoom;
};

Building::Building() {
m_livingRoom = "客厅";
m_bedRoom = "卧室";
}

GoodGay::GoodGay() {
building = new Building;
}

void GoodGay::visit() {
cout << "visit函数正在访问" << building->m_livingRoom << endl;
cout << "visit函数正在访问" << building->m_bedRoom << endl;
}

void GoodGay::visit2() {
cout << "visit函数正在访问" << building->m_livingRoom << endl;
//cout << "visit函数正在访问" << building->m_bedRoom << endl;不可以访问类内的私有成员
}

void test01() {
GoodGay ss;
ss.visit();
}

void test02() {
GoodGay ss;
ss.visit2();
}


int main() {
test01();
test02();
return 0;
}