函数在类作用域之外声明,但不是友元.这是怎么回事
Function declared outside class scope but not friend. How does this work?
我有以下类:
class PhoneCall{
private:
string number;
public:
/*some code here */
};
现在,我已经声明了一个函数(而不是friend到PhoneCall),它执行一些特定的操作并返回PhoneCall对象
PhoneCall callOperation()
另一个以PhoneCall对象作为参数
void userCall(PhoneCall obj)
我原以为它不会起作用,除非它明确声明为该类的朋友。
这些函数为什么以及如何工作,即使它们不是PhoneCall类的朋友?
类的友元函数是在该类的作用域之外定义的,但是它有权访问班http://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm
只要不访问类的私有成员或受保护成员,就可以在不通知其好友的情况下传递、操作和返回类的实例。
根据N4296。第261页:
11.3好友
类的友元是一个函数或类,它被授予使用类中的私有成员名和受保护成员名。
除非您将移动或复制构造函数声明为私有或受保护,否则对象也可以作为一个整体进行复制或移动。
因此,实际上private
PhoneCall
构造函数将阻止非好友实例化PhoneCall
对象:
例如:
class PhoneCall{
private: PhoneCall(){}
};
这可以防止非好友代码实例化类:
PhoneCall callOperation(){
return PhoneCall();
}
将导致编译时错误:
error: 'PhoneCall::PhoneCall()' is private
编辑:根据M.M在评论中的建议添加了关于私有构造函数的信息
相关文章:
- C++模板来检查友元函数的存在
- 使用递归的数组的最小值.这是怎么回事
- 模板类无法识别友元运算符
- 如何使用单独文件中的派生类访问友元函数对象
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 模板化的类和友元函数
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 如何在嵌套类中正确使用友元声明?
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 将子类方法声明为基类的友元
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 绕道重铸瓷砖层是怎么回事
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在将函数声明为友元时,尖括号的含义是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- 友元方法作为常量
- C++ 友元函数和私有构造函数
- 函数在类作用域之外声明,但不是友元.这是怎么回事