【问题标题】:Function declared outside class scope but not friend. How does this work?函数声明在类范围之外但不是友元。这是如何运作的?
【发布时间】:2015-11-07 22:13:07
【问题描述】:

我有以下课程:

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

【问题讨论】:

  • 您认为:userCall() 需要 PhoneCall 的哪个私有或受保护成员?
  • 如果你用std::string类型声明那些函数而不是PhoneCall,你需要这些函数与std::string成为朋友吗?
  • 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。它并不是说非友元函数不能返回或接受该类的对象作为参数。
  • 在原型中声明,userCall() 通过 setter @fukanchik 访问成员 string number
  • @AbrarShariarGalib 哦,真的吗?这个原型的哪一部分声明了这一点?

标签: c++ function friend


【解决方案1】:

只要您不访问其私有或受保护成员,您就可以传递、操作和返回一个类的实例,而无需成为它的朋友。

根据N4296。页。 261:

11.3 朋友

类的朋友是被授予权限的函数或类 使用类中的私有和受保护成员名称。

除非您将移动或复制构造函数声明为私有或受保护,否则对象也可以作为一个整体进行复制或移动。

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

例如:

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

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

PhoneCall callOperation(){
    return PhoneCall();
}

将导致编译时错误:

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

编辑:在 cmets 中按照 M.M 的建议添加了有关私有构造函数的信息。

【讨论】:

  • 也许 OP 忽略了在非好友代码中可能无法使用的 成员名称。对象仍可能作为一个整体被复制,或者以不涉及名称出现的其他方式访问这些成员。
  • @M.M 感谢您指出这一点。我只是加了一句关于构造函数的。
猜你喜欢
  • 2020-06-08
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多