在 class 范围外声明的函数,但不是友元。这是如何运作的?

Function declared outside class scope but not friend. How does this work?

我有以下 class:

class PhoneCall{
private:
    string number;
public:
    /*some code here */
};

现在,我已经声明了一个函数(不是 friendPhoneCall),它执行一些特定的操作和 returns 电话对象

PhoneCall callOperation()

另一个以 PhoneCall 对象作为参数

void userCall(PhoneCall obj)

我原以为它不会工作,除非它被明确声明为 class 的朋友。

即使这些函数不是 PhoneCall class 的 friend 为什么以及如何工作?

A friend function of a class is defined outside that class' scope but it has the right to access all private and protected members of the class http://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm

您可以传递、操作和 return 一个 class 的实例而无需成为其好友,只要您不访问其 私有或受保护成员.

根据 N4296。 p. 261:

11.3 Friends

A friend of a class is a function or class that is given permission to use the private and protected member names from the class.

除非您将移动或复制 构造函数 声明为私有或受保护,否则对象也可以作为一个整体进行复制或移动。

所以实际上 private PhoneCall 构造函数将阻止非朋友实例化 PhoneCall 对象:

例如:

class PhoneCall{
    private: PhoneCall(){}
};

这可以防止非好友代码实例化 class:

PhoneCall callOperation(){
    return PhoneCall();
}

会导致编译时错误:

error: 'PhoneCall::PhoneCall()' is private

编辑:根据 M.M 在评论中的建议添加了有关私有构造函数的信息。