在友元函数示例中,为什么以下说法是正确的?“请注意,在duplicate()的声明以及其在main()中的后续使用中,我们都没有将duplicate视为CRectangle类的成员。它并不是!它只是可以访问其私有和保护成员而不是成员。” Duplicate在CRectangle的公共部分中声明。为什么它不是成员函数而set_values是成员函数?这是一个好的例子吗?如果不是,有更好的例子吗?
class Rectangle
{
...
friend ostream &operator<<(ostream &stream, Rectangle r);
private:
int width;
int height;
};
ostream &operator<<(ostream &stream, Rectangle r)
{
return (stream << "{" << r.width << ", " << r.height << "}");
}
friend
的函数都不是该类的成员函数,它只是一个友元函数。答案在类中函数声明之前的friend关键字。
例如:friend CRectangle duplicate (CRectangle);
友元函数是一种允许访问类的私有成员变量的函数。它不是属于该类的成员函数。
set_values是该类的成员,因为它没有friend关键字,并且其作用域在类定义内部。方法体在类定义外部定义。即类似于前向定义,实现在后面。
通过在方法名前加上CRectangle::,我们告诉编译器这是在CRectangle类范围内声明的set_values函数的实现。
DeusAduro关于friend在哪里有用的回答是friend类的常见用法之一。
好的,我也来试试。
正如大家指出的那样,成员函数和友元函数之间的语法区别是friend
关键字。
这里有一种思考方式。成员函数有一个隐式参数:指向对象本身的指针。例如,在set_values
中,您可以使用成员width
和height
,它们将是调用set_values
的对象的成员。
另一方面,在duplicate()
内部不能单独使用标识符width
或height
,因为它不是成员函数,因此它没有隐式参数,即它与任何特定对象都没有关联。友谊的含义是,duplicate()
可以访问传递给它的任何CRectangle
对象的私有成员,或者是其范围内的局部变量。
friend operator<<
甚至可以完全在Rectangle
内部定义,包括函数体,语义保持不变。 - Pavel MinaevRectangle &r
,如果它是一个大类会更有效率。或者使用const Rectangle &r
会更好,这样你就可以打印一个“const Rectangle”(也许是你类中的一些用户定义常量)。 - VimNing