长春市网站建设_网站建设公司_GitHub_seo优化
2026/1/7 7:55:09 网站建设 项目流程

友元定义:友元是C++中的一种机制,允许特定的函数或类访问另一个类的私有成员和保护成员;

友元

就是 「给外部对象 / 函数开绿灯」—— 允许指定的外部函数、外部类,直接访问当前类的private(私有)和protected(保护)成员,无需通过public接口,是对类封装性的灵活补充(而非破坏)。

友元主要分为

「友元函数」 全局函数作为类的友元;

语法格式:
class类名{
friend返回值类型函数名(形参);/声明友元函数
}:

友元函数可以访问所有私有成员和保护成员,一般情况下不去使用,使用不当会破坏程序面向对象的特性

友元函数不是成员函数,它定义在类的外部,只需要在类中

「友元成员函数」

语法格式:
class A
friend返回类型类名1:成员函数(类名2&);
/声明友元成员函数
}

一个类的成员函数作为另一个类的友元;

「友元类」

语法格式:
class类名1{
friend class类名2;/声明友元类

一个类作为另一个类的友元;

友元不具有相互性,若类B是类A的友元,类A不一定是类B的友元
友元不能被继承一你爹的朋友不一—定是你的朋友
友元不具有传递性一你朋友的朋友不一定是你的朋友

四、友元的核心特性与关键注意点
1.友元关系是单向的:
若House声明BestFriend为友元,BestFriend可访问House的私有成员,但House不能访问BestFriend的私有成员(除非BestFriend也声明House为友元)
2.友元关系不可传递:
若A是B的友元,B是c的友元,不能推出A是C的友元(好友的好友,不一定是你的好友)。
3.友元关系不可继承:
父类的友元,不会自动成为子类的友元;子类若想让其访问私有成员,需单独声明。
4.友元不破坏封装性(合理使用下):
友元是「按需开放权限」,而非全盘公开,适用于特定场景(如运算符重载、两个类紧密协作),避免为了访问私有成员而写大量冗余的getter/setter。

友元函数

#include <iostream> // 包含C++标准输入输出流头文件,用于cout等输出操作 using namespace std; // 使用标准命名空间,避免在代码中重复使用std::前缀 // 定义Box类 class Box { public: // 公共成员区域,外部可访问 Box(int w); // 声明构造函数,接收一个int类型参数用于初始化width friend void printfBoxWidth(Box box); // 声明友元函数,该函数可以访问Box类的私有成员 private: // 私有成员区域,仅类内部和友元可访问 int width; // 私有成员变量,存储盒子的宽度 }; // 实现Box类的构造函数 // 注意:这里使用双冒号::表示属于Box类的成员函数 Box::Box(int w) { width = w; // 将参数w的值赋给私有成员变量width // 更优写法:使用初始化列表 Box::Box(int w) : width(w) {} } // 实现友元函数printfBoxWidth // 友元函数不是类的成员函数,但可以访问类的私有成员 void printfBoxWidth(Box box) { // 输出Box对象的width值,由于是友元函数,可以直接访问私有成员 cout << "box width is " << box.width << endl; } // 主函数,程序入口点 int main() { Box b(10); // 创建Box类的对象b,调用构造函数将width初始化为10 // b.width; // 错误!width是私有成员,外部无法直接访问 printfBoxWidth(b); // 通过友元函数访问Box对象的私有成员width return 0; // 程序正常结束,返回0 }
#include <iostream> using namespace std; class B; // 自定义类 MyClass class MyClass { friend class B; // B类是MyClass类的友元类 public: int pub_a; static int pub_s; // 静态成员变量只能类内声明类外实现 //B目前不是一个完整的类,所以我们需要进行类内声明类外进行实现 void pub_print(B& obj); private: int pri_a; static int pri_s; protected: int pro_a; static int pro_s; }; // 静态成员变量只能类外实现 int MyClass::pub_s = 10; int MyClass::pri_s = 20; int MyClass::pro_s = 30; class B { //友元关系是一个单向的 //将MyClass类作为B类的友元类 friend class MyClass; public: // 访问MyClass类中的成员 void print() { // 访问MyClass类中的静态成员变量 // 直接访问MyClass类中的静态成员变量 cout << "pub_s = " << MyClass::pub_s << endl; cout << "pri_s = " << MyClass::pri_s << endl; cout << "pro_s = " << MyClass::pro_s << endl; } // 访问MyClass类中的非静态成员变量 //就需要给成员函数一个类 类型的形参 void print1(MyClass& obj) { obj.pub_a = 111; obj.pri_a = 222; obj.pro_a = 333; cout << "pub_a = " << obj.pub_a << endl; cout << "pri_a = " << obj.pri_a << endl; cout << "pro_a = " << obj.pro_a << endl; } protected: int pro_data; //非静态成员变量 }; void MyClass::pub_print(B& obj){ obj.pro_data = 100; cout << "pro_data=" << obj.pro_data << endl; } int main() { // 进行实例化对象 MyClass obj; B demo; demo.print(); demo.print1(obj); obj.pub_print(demo); return 0; }
#include <iostream> using namespace std; //自定义类 MyClass class MyClass{ friend void print(); //友元函数 friend void print(MyClass &s); //友元函数 public: int pub_a; static int pub_s; private: int pri_a; static int pri_s; protected: int pro_a; static int pro_s; }; //静态成员变量的初始化 int MyClass::pub_s = 100; int MyClass::pri_s = 200; int MyClass::pro_s = 300; //全局函数 void print(){ //全局函数作为类的友元,可以直接访问到类中的静态成员变量 //静态成员变量不依赖于类对象 cout << "pub_s=" << MyClass::pub_s << endl; cout << "pri_s=" << MyClass::pri_s << endl; cout << "pro_s=" << MyClass::pro_s << endl; } //全局函数 void print(MyClass &s){ //MyClass &s = m1 //全局函数作为类的友元 //不能直接访问非静态成员变量 //需要给全局函数提供一个类 类型的形参 //非静态成员变量需要依赖于类对象 s.pub_a = 100; s.pri_a = 200; s.pro_a = 300; cout << "pub_a=" << s.pub_a << endl; cout << "pri_a=" << s.pri_a << endl; cout << "pro_a=" << s.pro_a << endl; } int main(){ print(); //访问的是类中的静态成员变量 MyClass m1; print(m1); //访问的是非静态成员变量 return 0; }
#include <iostream> using namespace std; //成员函数:将一个类的成员函数作为另一个类的友元 class Date; //Date类的前置声明 // 自定义类Time class Time { public: // 构造函数 Time(int h, int m, int s) : hour(h), minute(m), second(s) { cout << "Time(int h,int m,int s)" << endl; } // 析构函数 ~Time() { cout << "~Time()" << endl; } // 打印函数 void print() { cout << hour << ":" << minute << ":" << second << endl; } //友元成员函数 //切记:Date类目前是一个不完整的类 //所以必须要实现类内声明类外实现 void Show_Date_Time(Date& d); private: int hour; // 描述小时 int minute; // 描述分钟 int second; // 描述秒 }; // 自定义Date class Date { //友元可以放在任意的权限下,我们一般放在类的开头位置上 //友元成员函数 friend void Time::Show_Date_Time(Date& d); public: // 构造函数 Date(int y, int m, int d) : year(y), month(m), day(d) { cout << "Date(int y,int m,int d)" << endl; } // 打印函数 void print() { cout << "year=" << year << "/"; cout << "month=" << month << "/"; cout << "day=" << day << endl; } private: int year; // 描述年 int month; // 描述月 int day; // 描述日 protected: }; void Time::Show_Date_Time(Date& d){ cout << hour << ":"; cout << minute << ":"; cout << second << endl; cout << d.year << "/"; cout << d.month << "/"; cout << d.day << endl; } int main() { //实例化对象 Time t1(10,12,30); Date d1(2022,11,29); t1.Show_Date_Time(d1); return 0; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询