运算符“<<”指针

时间:2011-03-31 09:15:27

标签: c++ pointers operator-overloading

我有一个类Terminallog,它正在重载<<运营商。如果我做以下

Terminallog clog(3);
clog << "stackoverflow.com is cool" << endl;
一切正常。 “stackoverflow.com很酷”以漂亮的彩色方式打印到屏幕上,这正是Terminallog应该做的事情。

现在我试试

Terminallog* clog = new Terminallog(3);
clog << "stackoverflow.com is cool" << endl;

这给了我一个编译器错误:

error: invalid operands of types ‘Terminallog*’ and ‘const char [5]’ to binary ‘operator<<’

我可以看到传递“&lt;&lt;”的问题操作符指向一个指针,但是如何获得与非指针版本相同的行为?我可以简单地取消引用指针,但这会创建一个对象的本地副本(这对性能没有好处不是吗?)

因此我想知道这样做的正确方法是什么?

提前致谢

ftiaronsem

5 个答案:

答案 0 :(得分:8)

取消引用写入

的指针
*clog << "My message" << endl;

创建指向的对象的副本。通常,指针解除引用不会复制,并且复制的唯一方法是显式创建一个,通过值将对象传递给函数,或者按值从函数返回一个对象。带有指针取消引用的上述代码可能就是你要找的。

答案 1 :(得分:4)

实际上取消引用指针会给你一个参考,而不是一个副本,所以你没事。 (尝试复制流将并且失败,无论如何;流不是容器而是数据流。)

*clog << "text" << std::endl;

你不能写一个免费的(“全局”)函数operator<<,左边是指针 - TerminalLog,右边是其他东西,因为语言需要至少一个operator<<的操作数是一个类或枚举类型,你的RHS参数通常不会是一个。

答案 2 :(得分:2)

取消引用指针不会创建副本,它会创建引用。你可以解除它并取得正确的行为,不需要复制。

答案 3 :(得分:1)

简单:(*clog) << "stackoverflow.com is cool" << endl;

这不会创建clog的副本。

答案 4 :(得分:1)

Terminallog* clog = new Terminallog(3);
Terminallog& clog_r = *clog;
clog_r << "stackoverflow.com is cool" << endl;