我有以下课程:
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
答案 0 :(得分:5)
只要您不访问私人或受保护的成员,您就可以传递,操纵和返回课程的实例,而无需成为其朋友。
根据 N4296。页。 261 :
11.3朋友
班级的朋友是获得许可的职能或类别 使用类中的私有和受保护的成员名称。
除非您声明移动或将构造函数复制为私有或受保护,否则也可以复制或移动该对象。
所以实际上private
PhoneCall
构造函数会阻止非朋友实例化PhoneCall
个对象:
例如:
class PhoneCall{
private: PhoneCall(){}
};
这可以防止非好友代码实例化该类:
PhoneCall callOperation(){
return PhoneCall();
}
将导致编译时错误:
error: 'PhoneCall::PhoneCall()' is private
编辑:在评论中根据M.M的建议添加了有关私人构造函数的信息。