友元的目的是为了让指定函数或者类可以直接访问类内部的私有属性
1.全局函数做友元
全局函数访问类的私有属性,,需要将friend + 全局函数的声明写在类的最上方。#include<iostream> #include<string> using namespace std; class girlfriend { friend void boyfriend(girlfriend& num); public: girlfriend() { age = 20; name = "小美"; } private: int age; public: string name; }; void boyfriend(girlfriend &num) //全局变量做友元 { cout << "男朋友问女朋友名字:" << num.name << endl;//这里访问public属性 cout << "男朋友问女朋友年龄:" << num.age << endl;//这里访问private属性,没有友元则无法访问 } void test() { girlfriend num1; boyfriend(num1); } int main() { test(); }
2.类做友元
需要将friend + 类(友元)的声明写在类的最上方。男朋友类作友元,男朋友类的构造函数创建女朋友类的对象,通过成员函数visit访问女朋友的姓名。年龄,卧室
#include<iostream> #include<string> using namespace std; class girlfriend { friend class boyfriend; //类作友元 public: girlfriend(); private: int age; string bedroom; public: string name; }; class boyfriend { public: boyfriend(); void visit(); girlfriend* girl; }; void boyfriend::visit() //类外成员函数的定义 { cout << "男朋友知道她的" << girl->age << endl; cout << "男朋友知道她的" << girl->name << endl; cout << "男朋友参观了她的" << girl->bedroom << endl; } boyfriend::boyfriend() //类外构造函数的定义 { girl = new girlfriend; } girlfriend::girlfriend() //类外构造函数的定义 { age = 20; name = "小美"; bedroom = "卧室"; } void test() { boyfriend num1; num1.visit(); } int main() { test(); }
3.成员函数做友元
方法同上,在类内前面声明时注意写上作用域#include<iostream> #include<string> using namespace std; class girlfriend; class boyfriend { public: girlfriend* girl; void visit1(); void visit2(); boyfriend(); }; class girlfriend { friend void boyfriend::visit2(); //这里是类作友元 public: girlfriend(); private: int age; string bedroom; public: string name; }; void boyfriend::visit1() //访问公共属性 { cout << "男朋友知道她的" << girl->name << endl; } void boyfriend::visit2() //访问私有属性 { cout << "男朋友知道她的" << girl->age << endl; cout << "男朋友参观了她的" << girl->bedroom << endl; } boyfriend::boyfriend() { girl = new girlfriend; } girlfriend::girlfriend() { age = 20; name = "小美"; bedroom = "卧室"; } void test() { boyfriend num1; num1.visit1(); num1.visit2(); } int main() { test(); }
这里面易错点,顺序很严格,先按照程序执行的顺序走一遍,有些类需要现在前面声明一下,否则会出现各种问题。
以3.成员函数作友元为例,这里把class girlfriend先声明,若先写class girlfriend定义,此时boyfriend::visit2会出现私有属性无法访问的问题,由于此时boyfriend类还未创建,在执行friend void boyfriend::visit2()时,就会出现上述情况,其他情况也是一样