C++——友元函数

如下是一个日期类:

cpp 复制代码
class Date
{
public:
	Date(int year = 2023, int month = 10, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
		if (_month < 1 || month > 12 || _day < 1 || _day > GetMonthDay(_year, _month))
		{
			cout << "日期不规范" << endl;
			//exit(-1);  终止程序
		}
	}
	//拷贝构造函数
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	void print() const //const 放在这里,指的是this指针为const Date*类型,这样就可以让const Date类型进行print了
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
	int GetMonthDay(int year, int month)//获取某面某月的天数
	{
		//加static,可以省去每次访问时都开辟数组空间。
		static int MonthArray[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if ((month == 2) && ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)))
			return 29;
		return MonthArray[month];
	}
	//赋值运算符
	//返回类型为Date,支持连续赋值
	Date& operator=(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		return *this;//*this出了函数还在,就可以使用引用返回。
	}
private:
	int _year;
	int _month;
	int _day;
};

假设我们不使用日期类的print函数,通过<<符号重载,能不能实现日期类的打印?

然后使用:

发现这时无法使用的

原因:

这个内部函数的第一个参数,也就是<<左边的操作数,是this,为日期类

第二个参数为<<右侧的操作数out,为ostream类。

而我们调用的时候,cout << d1,左侧写的是ostream类,右侧写的是日期类,顺序发生了错误。

只要我们将顺序调换就可以正常使用了,但是这不太符合我们平时的使用习惯

要想手动设置两个参数的位置,就不能将其实现为内部的成员函数,而是类外部的函数:

但是,这样,类内部的private参数就不能访问了

这里的解决方法就是实现这个类的各种参数的set和get方法,但是这样有点麻烦

还有一种解决方式,就涉及到了友元。

友元:

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以要尽可能减少使用。

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加上friend关键字。

如下:

【BTW】:为了实现能够连续调用,返回类型改成了ostream类型

友元声明可以放在类内的任何地方。

这样就可以实现了<<的重载了。

同理,实现>>的重载,总体如下:

相关推荐
hansang_IR10 分钟前
【题解】P9753 [CSP-S 2023] 消消乐
数据结构·c++·算法
竞赛考级题库15 分钟前
202606 青少年等级考试C/C++真题一级 建议答题时长:60min
java·c语言·c++
linx29527 分钟前
阶段五讲义:STL 全貌——扔掉手写循环,学“动词“
c++
handler011 小时前
【Linux】动态库、静态库使用与原理
linux·运维·服务器·c++·c·动态库·静态库
raindayinrain1 小时前
c++并发--同步
c++·同步
蛋先生DX1 小时前
内存安全翻车现场的罪魁祸首,根源就在这三步里?
c++·后端·编程语言
小七在进步2 小时前
C++入门(1)
java·jvm·c++
晴天的雨.9922 小时前
[C++算法]快乐数
数据结构·c++·算法
影视飓风TIM2 小时前
C++11 核心新特性完整梳理
数据结构·c++·算法
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】Ollama本地大语言模型部署
c++·人工智能·语言模型·自然语言处理·面试