QString有一些方法,如toInt(),toLong()等。
这些方法接收指向bool的指针,该指针确定转换是否成功,如下所示:
int QString::toInt(bool * ok = 0, int base = 10) const
我的问题是:
为什么'ok'是指针而不是引用?
我知道它可以使用其中任何一种来实现,但是我没有看到在引用上使用指针的任何优点。
答案 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)
为什么'确定'指针而不是参考?
因为如果调用者需要发信号通常通过指针传递参数,所以不要使用此参数。因此,库的用户可以理解如何跳过使用此参数而无需在文档中进一步解释,即函数签名是自行记录的。