繁体   English   中英

Const指向指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM