Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 好友功能_C++_Friend - Fatal编程技术网

C++ 好友功能

C++ 好友功能,c++,friend,C++,Friend,对于 下面这句话是怎么回事 “请注意,无论是在duplicate()的声明中,还是在其以后在main()中的使用中,我们都没有将duplicate视为类CRectangle的成员。事实并非如此!它只是可以访问其私有和受保护的成员,而不是成员。” 副本在CRectangle的公共部分声明。它怎么不是一个成员函数和set_值呢 这是一个好例子吗?如果不是,还有更好的吗?在类中声明或定义为friend的任何函数都不是该类的成员。这只是一个朋友的功能 也就是说,如果类中也定义了一个friend函数,它将

对于
下面这句话是怎么回事

“请注意,无论是在duplicate()的声明中,还是在其以后在main()中的使用中,我们都没有将duplicate视为类CRectangle的成员。事实并非如此!它只是可以访问其私有和受保护的成员,而不是成员。”

副本在CRectangle的公共部分声明。它怎么不是一个成员函数和set_值呢


这是一个好例子吗?如果不是,还有更好的吗?

在类中声明或定义为
friend
的任何函数都不是该类的成员。这只是一个朋友的功能


也就是说,如果类中也定义了一个friend函数,它将通过涉及该类的ADL查找找到(通常用于重载运算符)。

Pavel的答案是对您问题的直接回答,但我认为您可能不清楚friend函数的用途,所以我想我会给出一个常见的示例

友元函数的一个常见用法是重载流操作符,其中特定操作符需要访问(或通过访问)对象的私有成员。即:

class Rectangle
{
...
    friend ostream &operator<<(ostream &stream, Rectangle r);
private:
    int width;
    int height;
};

friend ostream &operator<<(ostream &stream, Rectangle r)
{
    return (stream << "{" << width << ", " << height << "}");
}
类矩形
{
...

friend ostream&operator答案在类中函数声明之前的friend关键字中

i、 e.朋友CRectangle副本(CRectangle)

友元函数只是一个允许访问类私有成员变量的函数。它不是属于该类的成员函数

set_values是该类的成员,因为它没有friend关键字,并且它的作用域在类定义内。方法体在类定义外定义。例如,该类就像一个具有后续实现的正向定义(如下所示)

通过在方法名前面加上CRectangle::我们告诉编译器这是CRectangle类范围内声明的set_values函数的实现


DeusAduro关于friend在何处有用的回答是friend类的一个非常常见的用法。

好的,我也来尝试一下

正如大家所指出的,成员函数和友元函数的声明之间的语法差异是,
friend
关键字

这里有一种方法可以考虑这一点。成员函数有一个隐式参数:指向对象本身的指针。例如,在
set\u values
内部,您可以使用成员
width
height
,它们将是调用其
set\u values
的对象的成员

另一方面,您不能在
duplicate()
中单独使用标识符
width
height
,因为它不是成员函数,因此没有隐式参数,即它与任何特定对象都没有关联。友谊的意思是
duplicate()
可以访问传递给它的任何
CRectangle
对象的私有成员,或者该对象是其范围内的局部变量


另一点:朋友声明甚至不是一个函数的声明。它只是编译器的一个注释,如果这个特定的函数被定义,它将被访问这个类的私有成员。

一个很好的答案,并且值得指出的是<代码>朋友操作符并考虑使用<代码> ReCt。angle&r
如果它是一个大类,哪一个会更有效。或者
const Rectangle&r
会更好,这样您就可以打印一个“const Rectangle”(可能是类中的某个用户定义的常量)。但是,静态成员函数仍然是成员函数,即使它们没有任何隐式参数。此外,虽然友元声明不声明函数,但友元内联定义同时声明和定义函数(并使其成为
友元
).啊,现在真的很有趣了。:)成员函数:有一个隐式参数,可以访问私有静态和非静态成员。静态成员函数:没有隐式参数,只能访问静态数据成员。朋友函数:没有隐式参数,可以访问私有静态和非静态成员。很棒的poi顺便说一句,关于内联友元函数。