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

how*_*rks 8 c++ operator-overloading ostream

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

像这样

 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;
          }
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 21

会员功能:

ostream &operator<<(ostream &os);
Run Code Online (Sandbox Code Playgroud)

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

A a;
a << std::cout;
Run Code Online (Sandbox Code Playgroud)

即对象是操作员的左侧.


Ant*_*lov 19

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

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

幸运的是,operator<<如果您愿意,可以在课堂上定义为朋友.你的代码可以写成

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

为什么标准不允许您指定参数应该在哪一侧?让我们假装它做了,并添加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;
     }
};
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,事实上,你的定义friend operator<<并没有返回任何东西,这会弄乱链接.

  • 匿名downvoter,随时评论. (2认同)