繁体   English   中英

用于运算符重载的friend关键字

[英]friend keyword for operator overloading

我试着为<< - operator-overloading写一个简单的例子。 之前,我从未使用过关键字“朋友”。 但没有它它就行不通。 我做了什么错误或为什么我需要朋友关键字?

class rational{

public:
 rational(double num, double count)
    : n(num),c(count){}

 rational& operator+=(const rational& b){
    this->n+= b.n;
    this->c+= b.c;
    return *this;
 }

 friend std::ostream& operator<<(std::ostream& os, const rational& obj)
 {
 std::cout << obj.n << "," << obj.c << std::endl;
 return os;
 }

private:
 double n;
 double c;
};

谢谢

你没有犯任何错误。 friend关键字为您的operator<<()实现访问您的类的private (并且protected ,如果有的话)成员。

请注意,因为它是朋友,所以operator<<()这里隐式地是一个自由函数而不是一个成员函数(如果它是一个成员函数,它可以访问private东西!)。 因为它只在类中声明和定义,所以它只能通过参数依赖查找来找到,但这对于operator<<是好的,并且是一个你不必担心的细节。

您在声明和定义在类中操作,因此没有friend有型的隐式第一个操作数rational 如果您在类外声明了运算符,则不会出现此类问题,但是您将无法访问n和c。

您希望流式传输其内部不能通过其类的公共接口访问的对象,因此操作员无法获取它们。 然后你有两个选择:将公共成员放入进行流式处理的类中

class T {
  public:
    void stream_to(std::ostream& os) const {os << obj.data_;}
  private:
    int data_;
};

并从运营商那里打电话:

inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
   obj.stream_to(os);
   return os;
}

或者让操作员成为friend

class T {
  public:
    friend std::ostream& operator<<(std::ostream&, const T&);
  private:
    int data_;
};

这样它就可以访问班级的私人部分:

inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
   os << obj.data_;
   return os;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM