小学生学C++编程语法知识(C++中的友元函数(friend function))

📅 发布时间:2026/8/12 15:34:29
小学生学C++编程语法知识(C++中的友元函数(friend function))
C中的友元函数friend function——为什么一个“外人”可以进入类的私密房间同学们我们以前学习过封装类把自己的数据保护起来外面的人不能随便访问。例如class Student { private: int score; public: Student(int s) { score s; } };这里score是私有成员。外面Student s(100); cout s.score;会报错。为什么因为private私有成员只允许类自己访问。但是有一天出现一个特殊情况有一个“外人”虽然不是这个类的成员但是特别可靠希望它能够访问 private。怎么办C提供了friend友元一、什么是友元函数一句话友元函数是一个普通函数但是类允许它访问自己的私有成员。注意它不是类的成员函数。它只是普通函数 特殊权限例如#include iostream using namespace std; class Student { private: int score; public: Student(int s) { score s; } friend void show(Student s); }; void show(Student s) { cout s.score endl; } int main() { Student stu(100); show(stu); }输出100为什么因为虽然show()不是 Student 的成员函数。但是Student说friend void show(Student s);意思是我允许这个函数访问我的秘密。所以s.score可以访问。二、没有友元会怎样如果没有friend那么void show(Student s) { cout s.score; }编译错误score is private因为普通函数没有权限。三、生活中的例子假设你有一个小保险箱。里面private: 金币 密码 日记普通同学不能打开。但是你的爸爸你告诉他密码friend 爸爸于是爸爸可以打开。注意爸爸不是保险箱的一部分。但是拥有特殊权限。这就是友元。四、友元函数为什么必须在类里面声明这是很多初学者疑惑的问题。例如为什么不能class Student { private: int score; }; friend void show(Student s);这样写答案因为friend是一种“授权声明”。授权必须由拥有东西的人发出。我们举生活例子你的房子房主小明。小明说我允许张三进入我的房子。这个声明必须由小明说。不能张三自己说我宣布我是小明家的朋友所以我可以进去。不行。C也是一样类拥有private成员所以必须由类声明friend void show(Student s);表示“我允许show访问”。五、友元声明在哪里写通常写在class内部例如class Student { private: int score; public: friend void show(Student s); };位置其实private下面public下面都可以。例如这样也可以class Student { public: friend void show(Student s); private: int score; };因为friend声明不受private/public影响。六、friend声明只是授权不代表函数属于类这是重点很多学生容易误解看到friend void show(Student s);以为show是Student的方法。错误真正的成员函数class Student { public: void show(); };调用stu.show();友元函数friend void show(Student);调用show(stu);区别成员函数友元函数属于类吗是不是调用方式对象.函数()普通函数()能访问private吗可以可以需要friend吗不需要需要七、为什么需要友元函数那么问题来了既然破坏封装为什么还要存在主要有几个原因。1. 两个类需要互相合作例如有class A { private: int x; }; class B { private: int y; };如果A需要访问B内部数据。怎么办可以friend class A;2. 运算符重载这是最常见用途。例如我们想cout student;输出学生信息。实际上cout左边是ostream。不是Student。所以通常写friend ostream operator(ostream, Student);例如class Student { private: int score; public: Student(int s) { scores; } friend ostream operator(ostream out, Student s); }; ostream operator(ostream out, Student s) { outs.score; return out; }使用Student s(99); couts;输出99八、友元函数会破坏封装吗这是一个经典问题。答案会降低封装性但是有时候非常方便。为什么因为private本来是“不让别人看”。friend相当于“给某个人开后门”。所以不要大量使用。原则能不用friend就不用friend。 必须合作时再使用friend。九、友元函数和成员函数的区别考试重点例如class A { private: int x; public: void f(); friend void g(A); };其中f()成员函数特点a.f();内部有隐藏参数this指针g()友元函数普通函数g(a);没有this指针十、小学生记忆口诀 ⭐什么是友元不是家庭成员 但是拥有钥匙。为什么类里面声明谁家的秘密 谁决定开放。friend特点friend不是成员 但是能访问private。不要滥用friend是一把钥匙 钥匙越多家越不安全。十一、考点总结看到friend void fun();记住✅ fun不是成员函数✅ fun可以访问private✅ 必须在类内部声明✅ 类外定义✅ 不需要对象调用一句话总结友元函数是类授予某个普通函数的特殊访问权限它不是类成员却可以访问类的private成员。因为权限来自类本身所以必须由类内部进行friend声明而不能由外部自己声明。这也是 C 面向对象中“封装与特殊开放”的一个重要设计思想。