C++类基础
类创建
构造函数与析构函数
访问控制
静态成员
内联函数
this指针
友元函数与友元类
友元函数
在一个类A中,可以把某个函数声明为自己的友元,可以这么理解,A把某个函数func当作自己的朋友,因此该函数func可以访问A的成员(包括protected、private的成员,毕竟A把它当朋友)
#include <iostream>
using namespace std;
class Person;
void print(Person &p); // 参数为引用
class Person{
private:
int id;
string sex;
public:
Person(int i, string s): id(i), sex(s){}
friend void print(Person &p); // 友元函数,参数为引用
};
void print(Person &p){
cout << "id: " << p.id << endl << "sex: " << p.sex << endl;
}
int main(){
Person p(1, "男");
print(p);
}
注意:
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend
友元类
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都将成为另一个类的友元。
比如两个类A和B,A把B声明为自己的友元(即A把B当作朋友),因此B的成员函数可以访问A的所有成员(需要把A类型的引用作为参数)
注意:
- 虽然A把B当朋友,但B不一定把A当作朋友,因此A不能访问B的成员,也就是说,友元关系是单向的。
- 友元关系不能被继承,很简单,A把B当朋友,但不一定把B的孩子也当朋友。
#include <iostream>
using namespace std;
class A; //提前声明类
class B;
class A{
private:
string name;
public:
A(string s): name(s){}
friend class B; // 声明A的友元函数是B(可以理解为A把B当作朋友,因此B可以访问A的成员)
// 注意:A把B当作朋友,但B不一定把A当作朋友,因此A不能访问B的成员
};
class B{
string name;
public:
B() = default; // 无参构造函数可以用default构建
B(string s): name(s){}
void printA(A &a){ // B通过函数(把A当作函数参数)访问A,注意要把A的定义放在B之前
cout << "A的name是: " << a.name << endl;
}
};
int main(){
A a("小a");
B b("小b");
B b2;
b.printA(a);
b2.printA(a);
}
“友元”的缺点:破环了类的封装特性,因此,除非有必要,一般不要把整个类声明为友元类,而只将某些成员函数声明为友元函数,这样更安全一些。
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/articles/17299537.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2022-04-08 JVM垃圾回收机制