为什么QString :: toInt()接收指针而不是引用?

时间:2017-09-13 22:09:12

标签: c++ qt

QString有一些方法,如toInt(),toLong()等。

这些方法接收指向bool的指针,该指针确定转换是否成功,如下所示:

int QString::toInt(bool * ok = 0, int base = 10) const

我的问题是:

为什么'ok'是指针而不是引用?

我知道它可以使用其中任何一种来实现,但是我没有看到在引用上使用指针的任何优点。

4 个答案:

答案 0 :(得分:5)

在C ++中,引用必须引用某些内容。没有空引用检查,因此它不能是具有默认空值的可选参数,因为它带有指针,可以为null,并且可以检查以确定是否应该使用它。

如果他们使用不同的参数重载了函数,他们可以使用引用。但这更简单,更直接。

编辑:正如R Sahu所指出的,确实可以为参考参数提供默认值。但是,这可能会导致一些开销:

  • 最好的情况是,无论你是否真的通过了默认bool,每次都会设置默认bool。这可能最终会占用整个行缓存,浪费像64字节的珍贵L1缓存一样

  • 更糟糕的情况是,默认的bool不会被缓存,这需要RAM访问,这会在数据到达寄存器之前花费很多CPU周期

  • 最糟糕的情况是,内存将碰巧被分页,上帝禁止机械存储,这将比以前的情况花费更多

  • 另外,在一个非常常见的多线程场景中,这可能需要一些基本的同步,奇怪的是有人决定使用默认的bool而不是用户提供的bool,这将需要更多开销,即使在使用场景是线程安全的情况下

当然,由于不需要阅读,这种惩罚可能会在一定程度上被掩盖。但它仍将存在,并将付出代价。通过使用空指针可以完全避免这种情况,如果指针为空则简单地省略该访问。因此,使用&运算符的需要实际上是为了避免这一切而付出的代价。

答案 1 :(得分:4)

  

我知道它可以使用其中任何一个来实现,但我没有看到在引用上使用指针的任何优势。

您也可以使用带

的默认值的引用
int QString::toInt(bool& ok = some_bool_guaranteed_by_the_library,
                   int base = 10) const;

缺点是库必须提供some_bool_guaranteed_by_the_library作为全局可用的bool对象。听起来像图书馆的设计师没有看到提供这样一个对象的足够好处。

答案 2 :(得分:0)

使用带有默认参数的指针 ,用户只需拨打int res = QString::toInt()即可,无需参数。这对于引用来说非常棘手,您需要多次toInt()重载。

对于用户感兴趣的情况,如果转换成功或使用其他基础,指针就可以使用了。

答案 3 :(得分:0)

  

为什么'确定'指针而不是参考?

因为如果调用者需要发信号通常通过指针传递参数,所以不要使用此参数。因此,库的用户可以理解如何跳过使用此参数而无需在文档中进一步解释,即函数签名是自行记录的。