简介:C++友元的作用是让外部的对象(全局函数、类、类成员函数)能够访问到某个类里面的private修饰的数据,因此,必然是使用方法或者函数来操作数据。
1、全局函数做友元
使用全局函数做友元,函数接收一个对象,可以使用对象的指针或者引用。然后在函数体当中就可以操作private修饰的数据了。前提就是在对象所在的类中使用friend注册该全局函数为友元。
#include<iostream>
#include<string>
using namespace std;class Building {friend void global_friend(Building *b); //声明友元public:Building() {sitting_room = "客厅";beddingroom = "卧室";}public:string sitting_room;private:string beddingroom;
};void global_friend(Building *b){cout<<"访问"<<b->sitting_room<<endl;cout<<"访问"<<b->beddingroom;
}int main(){Building b = Building();global_friend(&b);
}
2、类做友元
将某个类注册为某个类中的友元类,那么外部类的所有方法就可访问需要的private属性了。
#include<iostream>
#include<string>
using namespace std;class Friend;
class Building {friend Friend; //声明友元public:Building();public:string sitting_room;private:string beddingroom;
};Building::Building() {sitting_room = "客厅";beddingroom = "卧室";}class Friend {public:void visit() {cout << "访问" << b.sitting_room << endl;cout<<"访问"<<b.beddingroom;}public:Friend() {b = Building();}private:Building b;};int main() {Friend f = Friend();f.visit();
}
3、成员函数做友元
这种做法和全局函数做友元差不多,只不过把全局函数变成了类的成员函数。写代码时,某个对象被new时其class类必须是完整的才行。代码顺序:定义友元类-->实现隐藏属性的类-->实现友元类。
#include<iostream>
#include<string>
using namespace std;
class Building;class Friend {public:void visit();void visit2();public:Friend();private:Building* b;};class Building {friend void Friend::visit();//声明成员函数为友元public:Building();public:string sitting_room;private:string beddingroom;
};Building::Building() {this->sitting_room = "客厅";this->beddingroom = "卧室";
}void Friend::visit() {cout << "访问" << b->sitting_room << endl;cout << "访问" << b->beddingroom<<endl;}
void Friend::visit2() {cout << "访问" << b->sitting_room << endl;}
Friend::Friend() {b = new Building();}int main() {Friend f = Friend();f.visit();f.visit2();
}