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

浙公网安备 33010602011771号