欢迎来观看温柔了岁月.c的博客 目前 设有C++学习专栏 C语言项目专栏 数据结构与算法专栏
目前主要更新C++学习专栏,C语言项目专栏不定时更新 待C++专栏完毕,会陆续更新C++项目专栏和数据结构与算法专栏
一周主要三更,星期三,星期五,星期天 感谢大家的支持
C++友元
什么是友元
- C++友元是用friend关键字修饰的函数或者类
2.友元的作用:用来打破类的封装(忽视权限的限定)
3.友元并不是说直接访问数据成员,友元只是提供一个场所,赋予对象具有打破权限限定的能力。
4.友元函数和友元类,不属于当前类,实现函数或者类不需要类名来限定
友元函数
#include<iostream> #include<string> using namespace std; class MM { public: MM() = default; //允许存在无参的函数 MM(int age, string name) :age(age), name(name) {} void printDate() { cout << "age = " << age << "name = " << name << endl; } friend void visitDate(MM& object); //友元函数 ,在类内用friend修饰 private: int age; string name; }; //可以类外实现,也可以类内实现,一般是类外实现 //类外实现不需要加类名进行限定,这也是与函数类外实现的区别 //注意任何数据的访问,都需要通过对象,友元只是赋予对象打破权限限定的权限 void visitDate(MM & object) { cout << object.name << endl; //函数传参访问 MM* pmm = new MM(10, " ni"); //new创建对象访问 pmm->name = "ni"; MM mm; // 默认构造构造无参函数访问 mm.age = 10; MM mm(10, "温柔了岁月"); // 成员函数访问 cout << mm.age << mm.name << endl; } int main() { system("pause"); return 0; }
以另一个类的成员函数为友元(了解即可)
以类A的成员函数,在类B中实现友元
一般都不这样写,了解即可
#include<iostream> #include<string> using namespace std; class A { public: void printA(A& object); private: int age; string name; }; class B { public: friend void A::printA(A& object); //加类名限定 private: int age; string name; }; void A::printA(A& object) { cout << object.age << endl; } int main() { system("pause"); return 0; }
友元类
用friend 修饰一个类
//友元类 #include<iostream> #include<string> using namespace std; class boy { public: boy(string name, int age); friend class girl; //友元类 private: int age; string name; }; //在girl类中无视boy类中的权限,什么都可以访问 class girl { public: void printDate(boy& object) { object.age = 10; cout << age << endl; } void printFate(boy & object) { boy* p = new boy("ni", 19); cout << p->age << p->name << endl; } private: int age; }; int main() { system("pause"); return 0; }
互为友元类(了解即可)
了解即可,一般不会这么写
//互为友元类 #include<iostream> #include<string> using namespace std; class A { public: friend class B; private: int age; string name; }; class B { public: friend class A; private: int age; string name; }; int main() { system("pause"); return 0; }