友元
友元的作用
友元,就是类似好朋友一样的存在,其他人进不来你的私密(private)处,但是友元可以。
能做友元的对象
- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元
平常情况(全局函数不是友元)
#include<iostream>
#include<string>
using namespace std;
class Room {
public:
string public_place;
private:
string private_place;
};
void wantIn(Room *other) {
cout << "我可以进入" << other->public_place << endl;
cout << "我可以进入" << other->private_place << endl; // error 报错,因为权限是private
}
那作为好朋友想要进去,怎么办
在类里面申明“好朋友证书”
class Room {
friend void wantIn(Room * others);
public:
string public_place;
private:
string private_place;
};
这样全局函数wantIn
就可以访问具有私密权限的成员变量了
类做友元
class Room;
class goodFriend {
public:
Room* room;
public:
goodFriend();
void visit();
};
class Room {
friend goodFriend; //核心代码
public:
Room();
string public_place;
private:
string private_place;
};
//写到类外
Room::Room() {
this->private_place = "私密房间";
this->public_place = "公开房间";
}
goodFriend::goodFriend() {
this->room = new Room;
}
void goodFriend::visit() {
cout << "我可以进入" << room->public_place << endl;
cout << "我可以进入" << room->private_place << endl;
}
void test() {
goodFriend gf;
gf.visit();
}
这次构造函数和成员函数,都拿到外面来写(但是要在类内声明)。如果全部写到类内太拥挤。
最核心的代码还是在Room类里friend goodFriend
这说明了goodFirend是它的友元。
成员函数做友元
现在只想要goodFirend里面的成员函数visit可以访问room的私有权限,visit2不能访问
class Room;
class goodFriend {
public:
Room* room;
public:
goodFriend();
void visit();
void visit2();
};
class Room {
friend void goodFriend::visit(); //核心
public:
Room();
string public_place;
private:
string private_place;
};
Room::Room() {
this->private_place = "私密房间";
this->public_place = "公开房间";
}
goodFriend::goodFriend() {
this->room = new Room;
}
void goodFriend::visit() {
cout << "我可以进入" << room->public_place << endl;
cout << "我可以进入" << room->private_place << endl;
}
void goodFriend::visit2() {
cout << "我可以进入" << room->public_place << endl;
cout << "我可以进入" << room->private_place << endl; //error
}
在Room类里面加入firend void goodFirend::visit()