[英]Const References to Pointers
我遇到了一些使用这样的方法的代码:
QList<Item*> itemList;
void addItem(Item* const& item)
{
itemList.append(item);
}
现在,我看不出它与此之间有任何有意义的区别:
QList<Item*> itemList;
void addItem(Item* item)
{
itemList.append(item);
}
但很明显有人不顾一切地使用这种奇怪的类型。 或许重构工具可能出错了。
保留该功能签名有什么好的理由吗? 某种表现不同的角落案例? 我什么都想不到。
唯一的区别是,在第一个版本中,您不允许更改函数内的本地item
的值(您仍然可以修改它指向的Item
)。 因此,如果您希望Item*
由于某种原因保持不同的值,您将被迫使用另一个类型为Item*
本地,并且该函数将消耗额外的sizeof(intptr_t)
字节的堆栈空间(boo hoo)。
我知道,不是惊天动地。
第一个声明意味着“item是一个常量指针引用变量”。 您不能将项目更改为指向ITEM类型的另一个数据,并且它也是一个引用,因此它指向在被调用函数中作为参数传递的指针。
伪代码:Item * myItem = new Pen(); 的AddItem(myItem); 第一个声明确保additem函数不会更改pen对象,因为它是一个常量引用,它也不会复制myItem的内容,它只是指向myItem的内存位置。 而第二个声明有复制myItem内容的开销。
它是对const指针的引用,这意味着您获得了此指针的昵称,但您无法更改它指向的地址。
指针副本等同于是,如果你也使它成为const。
我闻到了一个历史性的变化序列,这些变化使得代码达到了这一点,当然在几次命名重构之后。
我遇到的另一个显着差异是在堆栈上传递的实际数据。 在Item*
版本中, Item*
作为参数传递,需要一个dereference来获取Item
值。 但是,由于引用是通过传递指针在最终机器代码中实现的,因此Item* const&
version实际上将Item**
作为参数传递,需要两个解引用来获取Item
值。
这也解释了为什么你需要额外的堆栈空间来获得一个可修改的Item*
版本 - 你的调用者实际上没有在堆栈(或寄存器)中给你一个你可以搞乱的Item*
,你只有一个Item**
(或Item* const&
C ++土地)。
它是对可变值的常量指针的可变引用。
引用将允许您修改它的引用,但它恰好发生引用类型是一个常量指针,因此指针的值不能更改。 可以更改指针指向的值。
void* const &
直接传递常量指针将是等效的。
void* const
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.