函数在类作用域之外声明,但不是友元.这是怎么回事

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

本文关键字:友元 怎么回事 声明 作用域 函数      更新时间:2023-10-16

我有以下类:

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

现在,我已经声明了一个函数(而不是friendPhoneCall),它执行一些特定的操作并返回PhoneCall对象

PhoneCall callOperation()

另一个以PhoneCall对象作为参数

void userCall(PhoneCall obj)

我原以为它不会起作用,除非它明确声明为该类的朋友。

这些函数为什么以及如何工作,即使它们不是PhoneCall类的朋友

类的友元函数是在该类的作用域之外定义的,但是它有权访问班http://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm

只要不访问类的私有成员或受保护成员,就可以在不通知其好友的情况下传递、操作和返回类的实例

根据N4296。第261页

11.3好友

类的友元是一个函数或类,它被授予使用类中的私有成员名和受保护成员名。

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

因此,实际上privatePhoneCall构造函数将阻止非好友实例化PhoneCall对象:

例如:

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

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

PhoneCall callOperation(){
    return PhoneCall();
}

将导致编译时错误:

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

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