重载<<操作符

 

规则:

1. 操作符的处理顺序是从到右, 比如obj<<arg1<<arg2<<arg3, 执行顺序为obj.opt(arg1)-->obj.opt(arg2)->obj.opt(arg3)

2. 如何知道已完成了最后一个操作,这个可以通过析构来确认,比如下面代码的例子,Info()里面创建一个对象obj,那么Info()里面的对象在函数退出去就会析构,就可以知道操作已完成。

3. 如何判断第一个/最后一个操作,需要一个变量用于记录

4. 如何记录操作列表,需要一个容器用于记录,链表/队列/集合都可以用于记录每个操作

5. 每个操作需要返回对象引用(*this)

6. 每种形参都需要有对应的重载,除了系统可以自动转换的,系统无法识别的的会导致处理失败

 

class CTX;
class OUT {
    public:
        OUT(const int &lvl, const CTX &ctx) {printf("level:%d", lvl);};
        ~OUT() { printf("finish out\n");};

        inline OUT& operator<< (const int &val) {
            printf("That's operator << (%d)\n", val);
            return *this;
        };

        inline OUT& operator<< (const char *val) {
            printf("That's operator << (%s)\n", val);
            return *this;
        };
};

class CTX {
    public:
        CTX() {};
        ~CTX() {};

        OUT Info() {
            return OUT(1, *this);
        };

};

int TestCount(int &a, const int &b)
{
  a = a + 2;
  printf("That's idx(%d)\n", b);

  return a;
}


int main(int argc, char *argv[])
{
    printf("Oh, No.............\n");
    int i = 0;
    std::cout<<i++<<"|"<<i++<<"|"<<++i;
    std::cout<<TestCount(i, 1)<<TestCount(i, 2)<<TestCount(i, 3);

    CTX a;

    a.Info() << "ABC" << 1 << "abc" << 2 << "xxx" << 3;
    printf("LGTM!\n");

    return (EXIT_SUCCESS);
}

  

 

$ ./a.out
Oh, No.............
0|1|3That's idx(1)
5That's idx(2)
7That's idx(3)
9level:1That's operator << (ABC)
That's operator << (1)
That's operator << (abc)
That's operator << (2)
That's operator << (xxx)
That's operator << (3)
finish out
LGTM!

posted @ 2022-03-04 10:12  sciapex  阅读(178)  评论(0编辑  收藏  举报