c++中的友元
c++中创建类的时候会有公共权限、保护权限、私有权限。往往是访问不到一个类中私有权限中内容的。
在程序中,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术,这样一来两个类就可以共享数据。节省内存空间。 如果友元是一般成员函数或者类的成员函数,则称为友元函数,如果友元是一个类则称为友元类。友元类中所有的成员函数都是友元函数。接下来会分别介绍。
友元的目的:就是让一个函数或者类 访问另一个类中私有成员 友元的关键字为 friend
友元的三种实现:
1、全局函数做友元
2、类做友元
3、 成员函数做友元
1>、全局函数做友元
#include<iostream>
using namespace std;
#include<string>
class Building {
friend void familynumber(Building *building);//只要写在类内即可
public:
Building() {
this->m_BedRoom = "卧室";
this->m_SittingRoom = "客厅";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
//类外创建一个全局函数实现访问类内的私有、公共的成员变量
void familynumber(Building *building) {
cout << "家人进入房间的客厅" << building->m_SittingRoom << endl;
cout << "家人进入房间的卧室" << building->m_BedRoom << endl;//如果不在上面的类中加入友元函数的声明就会报错。
}
void test01() {
//创建一个对象
Building b;
familynumber(&b);
}
int main() {
test01();
system("pause");
return 0;
}
2、类做友元
一个类可以访问另外一个类中的私有成员。
//类做友元函数,创建两个类,用其中一个类去访问另外一个类中的私有成员
//下面写一个实例,创建一个父亲类、一个房间类,父亲类可以访问房间中的卧室私有属性
class Building;//在前面声明一下,要不然会报错
class Father {
public:
Father();
void visit();
private:
Building *building;
};
class Building {
friend class Father;//家人类要想访问房屋类中卧室这个私有属性,需要用到友元函数
public:
Building();
public:
string m_sittingRoom;
private:
string m_BedRoom;
};
//在类外写成员函数,前面加上成员函数的类名称和作用域
Building::Building() {
//给属性赋初值
this->m_sittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
//在类外写成员函数,前面加上成员函数的类名称和作用域
Father::Father() {
//利用指针创建一个建筑物对象
building = new Building;
}
//在类外写成员函数,前面加上成员函数的类名称和作用域
void Father::visit() {
cout << "家人访问" << building->m_sittingRoom << endl;
cout << "家人访问" << building->m_BedRoom << endl;
}
void test01() {
Father f;
f.visit();
}
int main() {
test01();
system("pause");
return 0;
}
3、 成员函数做友元
其实成员函数做友元很简单,就是在另外一个类中将成员函数变为友元函数 即可
//成员函数做友元函数 和上面类做友元函数区别不是很大
class Building;//在前面声明一下
class Father {
public:
Father();
//创建两个成员函数,分别去访问另一个的私有属性
void visit();
void visit1();
private:
Building *building;
};
class Building {
friend void Father::visit();
public:
Building();
public:
string m_sittingRoom;
private:
string m_BedRoom;
};
//在类外写成员函数,前面加上成员函数的类名称和作用域
Building::Building() {
//给属性赋初值
this->m_sittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
//在类外写成员函数,前面加上成员函数的类名称和作用域
Father::Father() {
//利用指针创建一个建筑物对象
building = new Building;
}
//在类外写成员函数,前面加上成员函数的类名称和作用域
void Father::visit() {
cout << "家人访问" << building->m_sittingRoom << endl;
cout << "家人访问" << building->m_BedRoom << endl;
}
//对于成员函数 Father类中的成员函数void visit1();就访问不了Building类中的私有成员。
void Father::visit1() {
cout << "家人访问" << building->m_sittingRoom << endl;
//cout << "家人访问" << building->m_BedRoom << endl;
}
void test01() {
Father f;
f.visit();
f.visit1();
}
int main() {
test01();
system("pause");
return 0;
}
注意友元函数在使用的过程中
1、类与类之间的友元关系不能被继承。(友元不属于类的成员函数)
2、友元函数破坏了封装的机制,最好谨慎使用。
3、友元函数就是让一个函数或者类 访问另一个类中私有成员,但是对于多个类之间的访问,友元函数不具有传递性。