繁体   English   中英

重载运算符<<在类内部工作吗?

[英]Does Overloading Operator<< works inside the class?

我的意思是,我试图在课堂内重载操作符<<

像这样

 class A {
      public:
           ostream &operator<<(ostream &os);// which doesnt work

      private:
           friend ostream &operator<<(ostream &os, const A& a); //Works
           int i;

 };

  Definition
          ostream &operator<<(ostream &os, const A& a) {
              os<<a.i;
              return os;
          }

为什么我不能在特定于类的类中重载运算符? 还是我错过了什么? 或者我是愚蠢甚至以这样的方式思考? 请指教。

会员功能:

ostream &operator<<(ostream &os);

确实有效,但不适合你想要的情况。 当您执行以下操作时将调用它:

A a;
a << std::cout;

即对象是操作员的左侧。

问题是你的operator<<将把ostream作为第二个参数,而不是第一个参数。 这样,你可以做myObject << std::cout ,但它看起来不直观,你将无法链接调用,因为operator<<是左关联的。

将运算符声明为朋友而不是成员函数的另一个好处是可以进行自动转换。 这意味着如果你有一个B类,它不是从A派生而是有一个B(A const&)构造函数,你仍然可以做std::cout << my_b; 并将其转换为A然后打印。

幸运的是,如果您愿意,可以在类中定义operator<<作为朋友。 你的代码可以写成

class A {
    int i;
    friend std::ostream& operator<<(std::ostream& o, A const& a) {
        o << a.i;
        return o;
    }
};

为什么标准不允许您指定参数应该在哪一侧? 让我们假装它,并添加left_ofright_of关键字来指定:

struct B;

struct A {
     A left_of operator+(B const&) {
         return *this;
     }
};

struct B {
     B right_of operator+(A const&) {
         return *this;
     }
};

现在当我们做A a; B b; f(a + b);时会发生什么 A a; B b; f(a + b); 每个类都有一个处理这种情况的运算符,这意味着我们无法决定。 由于转换的可能性,看到尽可能多的运营商应该是朋友,不允许这种事情并不是一个大问题,并防止这种模糊。 (当然,你也可以定义一个成员运算符和一个自由运算符,这会导致一个非常类似的问题。)

顺便说一句,就像事情一样,你的friend operator<<的定义没有返回任何东西,这会弄乱链接。

请记住,对于类的非静态成员函数,第一个参数是this指针。 因此,编译后的“operator <<”函数的签名将变为:

ostream &operator<<(A *this, ostream &os);

当您执行以下操作时,这将起作用:

A obj;
obj << std::cout;

将“obj”视为第一个参数,将“std :: cout”视为运算符“<<”的第二个参数。

重载“<<”的更好方法是使用友元函数,因为通过这种方式,您可以使重载运算符关联。

暂无
暂无

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

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