将运算符"<<"应用于指针

4

我有一个名为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<<

我看到问题出在将"<<"运算符传递给指针上,但我该如何获得与非指针版本相同的行为呢?我可以简单地对指针进行解引用,但那会创建对象的本地副本(这对性能来说不是好事吧?)因此,我想知道正确的做法是什么?谢谢!

3
我认为取消引用指针并不会创建对象的本地副本。 - Björn Pollex
5个回答

8
解除指针引用以写入
*clog << "My message" << endl;

指针解引用不会创建指向对象的副本。一般来说,指针解引用并不会创建副本,想要创建副本的唯一方法是显式地创建一个副本,按值传递对象给函数或者按值从函数返回对象。上述带有指针解引用的代码可能是您正在寻找的。


1
为了完整性,解除指针引用会创建一个引用(语义上)。 - Matthieu M.

4
实际上,解除指针引用会给你一个引用而不是副本,所以你没问题。(尝试复制流应该会失败,而且应该会失败;流不是容器,而是数据的流动。)
*clog << "text" << std::endl;

你不能编写一个自由的(“全局”的)函数operator<<,将指针作为左操作数,其他内容作为右操作数,因为语言要求operator<<的至少一个操作数是类或枚举类型,而你的RHS参数往往不是其中之一。


你的推理是错误的。操作数的一侧没有意义。重要的是至少有一个操作数是类或枚举类型。(http://ideone.com/4zhQt) - visitor

2
解引用指针不会创建副本,它创建一个引用。您可以直接解引用并获得正确的行为,无需复制。

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

你的意思是 Terminallog& clog_r = *clog; 吗? - CharlesB

1

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

这并不会创建一个clog的拷贝。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接