重载<<操作符
规则:
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!