簡體   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