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

时间:2015-11-07 22:13:08

标签: c++ function friend

我有以下课程:

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

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

PhoneCall callOperation()

另一个将 PhoneCall 对象作为参数

void userCall(PhoneCall obj)

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

即使这些功能不是朋友 PhoneCall 类,这些功能为何以及如何运作?

  

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

1 个答案:

答案 0 :(得分:5)

只要您不访问私人或受保护的成员,您就可以传递,操纵和返回课程的实例,而无需成为其朋友。

根据 N4296。页。 261

  

11.3朋友

     

班级的朋友是获得许可的职能或类别   使用类中的私有和受保护的成员名称。

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

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

例如:

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

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

PhoneCall callOperation(){
    return PhoneCall();
}

将导致编译时错误:

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

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