使用友元函数重载算术运算符



我找到了一个如何使用友元函数重载算术运算符的示例,重载的运算符函数在类中定义,注释如下:

/* This function is not considered a member of the class, even though the definition is 
inside the class */

下面是示例:

#include <iostream>
class Cents
{
private:
int m_cents {};
public:
Cents(int cents) : m_cents{ cents } { }
// add Cents + Cents using a friend function
// This function is not considered a member of the class, even though the definition is inside the class
friend Cents operator+(const Cents& c1, const Cents& c2)
{
// use the Cents constructor and operator+(int, int)
// we can access m_cents directly because this is a friend function
return Cents{c1.m_cents + c2.m_cents};
}
int getCents() const { return m_cents; }
};
int main()
{
Cents cents1{ 6 };
Cents cents2{ 8 };
Cents centsSum{ cents1 + cents2 };
std::cout << "I have " << centsSum.getCents() << " cents.n";
return 0;
}

这个函数真的不是那个类的成员吗?和都是友元函数,定义在类内部,但不是该类的成员它只适用于使用friend关键字的重载函数。

这个函数真的不是那个类的成员吗?

是的。

和都是定义在类内部但不是该类成员的友元函数

是的。简单地说,你不是你的朋友。你的朋友可能可以访问你所有的东西(访问类成员),住在你的房子里(在类体内定义),但他们仍然不是你(类的成员)。它们与类分离,唯一的耦合是它们可以访问类成员。

选自c++ 17标准(12.2类成员)

2成员声明不声明类的新成员

(2.1) -一个朋友宣言(14.3)

(2.2) -一个static_assert声明,

(2.3) - using声明(10.3.3),或

(2.4) -一个空声明。

对于任何其他成员声明,每个声明的实体不是未命名的位字段(12.2.4)是类的成员,每个都是这样的至少一个成员名类或声明至少一个未命名的位域。

1类的友元是被授予权限的函数或类从类中使用私有和受保护的成员名。一个类通过友元声明指定它的友元(如果有的话)。等声明赋予友元特殊的访问权限,但它们确实如此不让被提名的朋友成为befriending类的成员。

因此,友元函数不是被声明为友元函数的类的成员,即使它们也在类中定义。

最新更新