C++友元函数详解:如何利用友元进行运算符重载
创作时间:
作者:
@小白创作中心
C++友元函数详解:如何利用友元进行运算符重载
引用
CSDN
1.
https://blog.csdn.net/m0_75266675/article/details/139140723
在C++中,类的私有成员只能通过公有方法访问,但有时这种限制过于严格,不适合特定的编程问题。为了解决这个问题,C++提供了友元(friend)机制,允许特定的函数或类访问另一个类的私有成员。本文将通过一个具体的例子,详细介绍如何使用友元函数进行运算符重载。
友元函数的基本使用
创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend
。例如,在Time
类中,如果需要实现一个友元函数来重载乘法运算符,应该这样声明:
friend Time operator *(double m, const Time& t);
第二步是编写函数定义。由于友元函数不是类成员函数,因此不需要使用Time::
限定符,同时在定义中也不需要使用friend
关键字。例如:
Time operator *(double m, const Time& t)
{
int minus = int(m*(t.hours*60+t.minutes));//直接使用私有成员t.hours和t.minutes
return Time(minus / 60, minus % 60);
}
完整代码示例
下面是一个完整的Time
类的实现,展示了如何使用友元函数进行运算符重载:
class Time
{
private:
int hours;//小时
int minutes;//分钟
public:
Time(int h = 0, int m = 0);
Time operator +(const Time& t)const;//重载+,注意返回值不是引用
Time operator -(const Time& t)const;
Time operator *(double n)const;
void show() const;
friend Time operator *(double m, const Time& t);//友元函数
};
Time::Time(int h, int m)
{
hours = h;
minutes = m;
}
Time Time::operator +(const Time& t) const//返回的是临时变量,不能写引用
{
return Time(hours + t.hours + (minutes + t.minutes) / 60, (minutes + t.minutes) % 60);
}
Time Time::operator -(const Time& t)const
{
int minu1 = hours * 60 + minutes;//把this的时间转为分钟
int minu2 = t.hours * 60 + t.minutes;//把t的时间转为分钟
return Time((minu1 - minu2) / 60, (minu1 - minu2) % 60);
}
Time Time::operator *(double n)const
{
int minu = hours * 60 + minutes;//把this的时间转为分钟
minu = int(minu * n);//分钟取整
return Time(minu / 60, minu % 60);
}
void Time::show() const
{
cout << hours << "小时," << minutes << "分钟" << endl;
}
Time operator *(double m, const Time& t)
{
int minus = int(m * (t.hours * 60 + t.minutes));//直接使用私有成员t.hours和t.minutes
return Time(minus / 60, minus % 60);
}
int main()
{
Time t1 = { 2,35 };
Time t2 = 3 * t1;//数字写在前,编译器转为t2=operator*(3,t1);
t2.show();
return 0;
}
更简洁的实现方式
实际上,还有更简洁的方法来实现友元函数。利用乘法交换律,可以把友元函数改为非友元函数:
Time operator *(double m, const Time &t)
{
return t*m;//利用t的成员函数.
}
这种方法更简单,但友元函数实现也是一个好主意,它将作为类接口的组成部分。
总结
当需要为类重载运算符时,可以采用以下策略:
- 定义第一个操作数为类对象的成员函数
- 添加一个第一个操作数为非类对象的友元函数
- 在友元函数内部,利用交换律调用类成员函数(前提是运算符满足交换律)
如果运算符重载函数需要访问类的私有数据,可以采用以下方法:
- 利用交换律(前提是类已经实现该运算符的重载)
- 将函数声明为类的友元函数
- 提供获取私有数据的公有方法
通过本文的讲解和示例代码,相信读者能够掌握C++中友元函数的基本使用方法及其在运算符重载中的应用。
热门推荐
《在我的花园里要燥起来》歌词解读:释放压力,享受当下的生活态度
克苏鲁系名字(如何起一个克苏鲁风格的名字)
乙肝疫苗打完注意事项
丝带绣——为生活增添色彩的艺术
猪油用什么容器装好(猪油用什么容器装好一点呢)
清末两支最强新军:北洋产军阀,湖北产革命党
牙齿内侧发黄有牙垢怎么去除?日常清洁|专科清洁有不同方法,调整生活习惯可预防!
煤炭集团如何杜绝重大安全隐患
如何在会议中恰当表达自己的观点而不显得过于强势
昆山亭林公园游玩攻略:开放时间、门票及主要景点介绍
嘉禾精准服务 圆残疾人就业梦
盐酸哌罗匹隆片的安全剂量标准在哪个范围
刘光慧团队:衰老疫苗——通往人类健康衰老之路
韩语中多样化表达“我喜欢你”的方式与文化背景解析
Excel表格制作完整教程:从模板选择到数据可视化
人工智能如何不破坏人类
什么面食最简单?这些方法让您轻松上手
被别人辱骂后心里难受怎么办?7个实用建议帮你调整心态
能提供优惠,代缴电费?当心,这可能是新型“洗钱”!
《精灵宝可梦Let's Go》伊布全进化图鉴及伊布招式资料详解
受仿生捕蝇草启发的软体抓手载荷及稳定性增强方面的研究和应用
赤松茸喜获丰收 林下经济带来好“钱景”
描写同学的性格有哪些?描写同学性格的N种方法:抓住细节,刻画鲜明形象!
为什么我希望《PHYSINT》成为小岛秀夫的下一个《潜龙谍影》?
舌头不舒服挂什么科
在瑜伽跪姿体式中膝盖疼怎么解决
黑曜石是翡翠吗?与翡翠相比,哪种更珍贵?是玉石的一种吗?
用DeepSeek买彩票,聪明反被聪明误
什么是模切?一种精确切割的制造工艺
从炼金术到核物理:人类如何实现点石成金的梦想