关于 QDebug 左移操作符重载

17 篇文章 9 订阅
从创建了一个自定义类型开始吧:
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 相当类似:

1
2
qDebug()<<"From Qt qDebug()";
std::cout<<"From C++ std::cout"<<std::endl;

但是,每次调用qDebug(), 都会创建一个新的 QDebug 对象

1
QDebug qDebug() { return QDebug(QtDebugMsg); }

而 std::cout 却是一个全局的 std::ostream 对象, C++头文件iostream 看起来大概这样:

1
2
3
4
5
namespace std
{
    extern ostream cout;
    static ios_base::Init __ioinit;
}

可是,为什么 QDebug 不能使用引用呢?

我们知道,

1
qDebug() << Point(1,2);

可以写成:

1
QDebug(QtDebugMsg) << Point(1,2);

还可以写成:

1
operator <<(QDebug(QtDebugMsg), Point(1,2));

我们可以清晰看到,一个 QDebug 的临时对象作为实参传递给操作符函数.

由于,C++中:

A temporary cannot be bound to a non-const reference.

所以QDebug需要使用

1
QDebug operator<<(QDebug dbg, const Point &p)

而不能使用

1
QDebug & operator<<(QDebug &dbg, const Point &p)


一个有趣的问题??

尽管如此,可是网络上有网友抱怨:当采用下面的重载形式时,

1
QDebug & operator<<(QDebug &dbg, const Point &p)

对于 qDebug()<<Point(1,2); 确实不工作,但是下面的用法却运行正常 qDebug()<<""<<Point(1,2);为什么?

后者可以写成

1
operator <<(QDebug(QtDebugMsg).operator <<(""), Point(1,2));

注意到, 对 char *类型,QDebug有单独的成员函数。

1
QDebug & QDebug::operator<<(const char * s);

该成员函数返回的时一个引用,所以C++编译器此时不再抱怨临时变量的非常量引用问题。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值