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
只要您不访问其私有或受保护的成员,您就可以传递,操作和返回类的实例,而无需成为其朋友.
根据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的建议添加了有关私有构造函数的信息.
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |