在 class 范围外声明的函数,但不是友元。这是如何运作的?
Function declared outside class scope but not friend. How does this work?
我有以下 class:
class PhoneCall{
private:
string number;
public:
/*some code here */
};
现在,我已经声明了一个函数(不是 friend 到 PhoneCall),它执行一些特定的操作和 returns 电话对象
PhoneCall callOperation()
另一个以 PhoneCall 对象作为参数
void userCall(PhoneCall obj)
我原以为它不会工作,除非它被明确声明为 class 的朋友。
即使这些函数不是 PhoneCall class 的 friend 为什么以及如何工作?
A friend function of a class is defined outside that class' scope but
it has the right to access all private and protected members of the
class
http://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm
您可以传递、操作和 return 一个 class 的实例而无需成为其好友,只要您不访问其 私有或受保护成员.
根据 N4296。 p. 261:
11.3 Friends
A friend of a class is a function or class that is given permission to
use the private and protected member names from the class.
除非您将移动或复制 构造函数 声明为私有或受保护,否则对象也可以作为一个整体进行复制或移动。
所以实际上 private
PhoneCall
构造函数将阻止非朋友实例化 PhoneCall
对象:
例如:
class PhoneCall{
private: PhoneCall(){}
};
这可以防止非好友代码实例化 class:
PhoneCall callOperation(){
return PhoneCall();
}
会导致编译时错误:
error: 'PhoneCall::PhoneCall()' is private
编辑:根据 M.M 在评论中的建议添加了有关私有构造函数的信息。
我有以下 class:
class PhoneCall{
private:
string number;
public:
/*some code here */
};
现在,我已经声明了一个函数(不是 friend 到 PhoneCall),它执行一些特定的操作和 returns 电话对象
PhoneCall callOperation()
另一个以 PhoneCall 对象作为参数
void userCall(PhoneCall obj)
我原以为它不会工作,除非它被明确声明为 class 的朋友。
即使这些函数不是 PhoneCall class 的 friend 为什么以及如何工作?
A friend function of a class is defined outside that class' scope but it has the right to access all private and protected members of the class http://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm
您可以传递、操作和 return 一个 class 的实例而无需成为其好友,只要您不访问其 私有或受保护成员.
根据 N4296。 p. 261:
11.3 Friends
A friend of a class is a function or class that is given permission to use the private and protected member names from the class.
除非您将移动或复制 构造函数 声明为私有或受保护,否则对象也可以作为一个整体进行复制或移动。
所以实际上 private
PhoneCall
构造函数将阻止非朋友实例化 PhoneCall
对象:
例如:
class PhoneCall{
private: PhoneCall(){}
};
这可以防止非好友代码实例化 class:
PhoneCall callOperation(){
return PhoneCall();
}
会导致编译时错误:
error: 'PhoneCall::PhoneCall()' is private
编辑:根据 M.M 在评论中的建议添加了有关私有构造函数的信息。