函数在类范围外声明但不是朋友.这是如何运作的?

Abr*_*rar 0 c++ function friend

我有以下课程:

class PhoneCall{
private:
    string number;
public:
    /*some code here */
};
Run Code Online (Sandbox Code Playgroud)

现在,我宣布一个函数(不是朋友PhoneCall,做一些具体的操作和返回)PhoneCall对象

PhoneCall callOperation()
Run Code Online (Sandbox Code Playgroud)

另一个将PhoneCall对象作为参数

void userCall(PhoneCall obj)
Run Code Online (Sandbox Code Playgroud)

我期待它不起作用,除非明确宣布为该类的朋友.

即使他们不是PhoneCall类的朋友,这些功能为什么以及如何工作?

类的友元函数在类的范围之外定义,但它有权访问类的所有私有和受保护成员 http://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm

oo_*_*uel 5

只要您不访问其私有或受保护的成员,您就可以传递,操作和返回类的实例,而无需成为其朋友.

根据N4296.页.261:

11.3朋友

类的朋友是一个函数或类,它被授予使用类中的私有和受保护成员名称的权限.

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

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

例如:

class PhoneCall{
    private: PhoneCall(){}
};
Run Code Online (Sandbox Code Playgroud)

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

PhoneCall callOperation(){
    return PhoneCall();
}
Run Code Online (Sandbox Code Playgroud)

将导致编译时错误:

error: 'PhoneCall::PhoneCall()' is private
Run Code Online (Sandbox Code Playgroud)

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