C++友元

友元函数

复制代码
class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	}
	ostream& operator<<(ostream& _cout)
	{
		_cout << _year << "年" << _month << "月" << _day << "日";
		return _cout;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d(2025, 8, 2);
	d << cout << endl;//不符合常规调用
    //cout<< d << endl;//正常书写
	return 0;
}

当我们运行上述代码,可以正常对类进行打印,但代码的书写却不符合常规的调用,因此我们需要在类外面对这一函数进行定义,但是由于需要直接访问类的私有成员,因此这就需要用到友元函数。

友元函数是可以直接访问类中私有成员 的函数,它定义在类外且不属于任何类 ,但却需要在类内声明 ,声明时需要在函数返回类型前加关键字friend。

复制代码
class Date
{
	friend ostream& operator<<(ostream& _cout, const Date& d);//类内声明
	friend istream& operator>>(istream& _cin, Date& d);
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	}
private:
	int _year;
	int _month;
	int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)//类外定义
{
	_cout << d._year << "年" << d._month << "月" << d._day << "日";
	return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
	_cin >> d._year >> d._month >> d._day;
	return _cin;
}
int main()
{
	Date d(2025, 8, 2);
	cout << d << endl;
	cin >> d;
	cout << d << endl;
	return 0;
}

注:友元函数可以访问类的私有成员和保护成员,但它不属于类

友元函数由于没有this指针,因此不能用const修饰

友元函数可以在类中任何地方声明,不受访问限定符的限制

一个函数可以是多个类的友元函数

友元函数的调用与普通函数的调用原理相同

友元类

友元类的所有成员函数都可以是另一个类的友元函数,且都可以访问另一个类中的非公有成员

友元关系是单向的,并不具有交换性

友元关系不能传递

友元关系不能继承

复制代码
class Time
{
	friend class Date; //声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有变量
public:                //且友元是单向的,时间类无法访问日期类的私有成员
    Time(int hour = 0, int minute = 0, int second = 0)
		: _hour(hour)
		, _minute(minute)
		, _second(second)
	{}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}
	void SetTimeOfDate(int hour, int minute, int second)
	{
		// 直接访问时间类私有的成员变量
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};
相关推荐
geoyster9 分钟前
20250802-102508010-CP
算法
jdlxx_dongfangxing9 分钟前
2023 年 NOI 最后一题题解
c++·noi
Q741_14722 分钟前
优选算法 力扣 202.快乐数 快慢双指针 解决带环问题 C++解题思路 每日一题
c++·算法·leetcode·快慢双指针·环形问题
DONG91322 分钟前
Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
开发语言·汇编·数据结构·python·算法·青少年编程·排序算法
R-G-B31 分钟前
【C++ 初级工程师面试--4】形参带默认值的函数,特点,效率,注意事项
开发语言·c++·形参带默认值的函数·形参默认值特点,效率,注意事项·形参默认值特点·形参默认值效率·形参默认值注意事项
西红柿煎蛋41 分钟前
C++17的 std::string_view 是为了解决什么问题?它和 const std::string& 相比有什么核心优势和潜在陷阱?
c++
Q_Q5110082851 小时前
python的驾校培训预约管理系统
开发语言·python·django·flask·node.js·php
GeekPMAlex1 小时前
RAG 02 多模态检索 多维主键
算法
CoovallyAIHub1 小时前
只有2MB,却能跑满277FPS?专为无人机小目标打造!
深度学习·算法·计算机视觉
金宗汉1 小时前
文明存续的时间博弈:论地球资源枯竭临界期的技术突围与行动紧迫性
大数据·人工智能·笔记·算法·观察者模式