从创建了一个自定义类型开始吧:
为什么QDebug 不使用引用呢?
struct Point
{
Point(int x, int y):x(x),y(y){}
int x;
int y;
};
如果我们想让其配合QDebug工作,需要重载左移操作符(流操作符)
QDebug operator<<(QDebug dbg, const Point &p)等等...
在 C++ 中,为了配合 std::cout 我们不是这么做的么?
ostream &operator<<(ostream &out, const Point &p)
为什么QDebug 不使用引用呢?
qDebug() vs. std::cout
第一眼看起来, qDebug() 和 std::cout 相当类似:
但是,每次调用qDebug(), 都会创建一个新的 QDebug 对象
而 std::cout 却是一个全局的 std::ostream 对象,
C++头文件iostream 看起来大概这样:
可是,为什么 QDebug 不能使用引用呢?
我们知道,
可以写成:
还可以写成:
我们可以清晰看到,一个 QDebug 的临时对象作为实参传递给操作符函数.
由于,C++中:
A temporary cannot be bound to a non-const reference.
所以QDebug需要使用
而不能使用
一个有趣的问题??
尽管如此,可是网络上有网友抱怨:当采用下面的重载形式时,
对于 qDebug()<<Point(1,2); 确实不工作,但是下面的用法却运行正常 qDebug()<<""<<Point(1,2);为什么?
后者可以写成
注意到, 对 char
*类型,QDebug有单独的成员函数。
该成员函数返回的时一个引用,所以C++编译器此时不再抱怨临时变量的非常量引用问题。

本文探讨了Qt中的qDebug()与C++标准库中的std::cout在使用上的不同,特别是针对临时对象处理和操作符重载方面的差异。通过对比两者的实现方式,解释了为何qDebug()的操作符重载需要使用非引用参数。

被折叠的 条评论
为什么被折叠?



