簡體   English   中英

將C ++ struct成員從非const轉換為const

[英]Convert C++ struct members from non-const to const

有沒有一種簡單的方法將非const C ++結構(通過指針)傳遞給函數,並確保該函數不能更改結構的成員?

例如:從配置文件加載結構,這需要結構為非const。 但是然后一個指向結構的指針被傳遞給一個不允許改變任何東西的函數。

我已經通過創建結構的第二個逐字“const”副本並且繁瑣地復制每個成員來看到這一點。 這看起來很奇怪。 我是C#程序員,所以也許這就是它在C ++中完成的方式......?

在C ++中,您可以傳遞大對象作為引用或指針,它們都被稱為“按引用調用”,而不是“按值調用”,其中進行復制。 指針語法由C語言繼承,與C ++引用不同。

要使編譯器抱怨對象的更改,必須使用const關鍵字。 當然,無論如何你都可以將const轉換為更改值,但不推薦使用const

讓我們假設您在以下示例中有一個類BigObject ,其公共成員a是一個整數int

1.通過引用調用(&:引用類型):

void function(const BigObject& input)
{
   int a = input.a; /* read from BigObject     */
   input.a = 42;    /* the compiler will fail! */
}

/* call that function */
BigObject input();
function(input); /* no address operator needed */

const關鍵字將使引用& (此處不是地址運算符)引用此引用無法更改的數據。 如果您嘗試編譯器將無法編譯。

2.按引用調用(*:指針類型):

void function(const BigObject* input)
{
   int a = input->a;  /* read from BigObject     */
   int b = (*input).a /* alternative to ->       */
   input->a = 42;     /* the compiler will fail! */
}

/* call that function */
BigObject input();
function(&input); /* pass address */

參數是指針類型,指向此指針無法更改的數據。 您還可以使用: const BigObject* const input使指針保持不變,有關此內容的更多說明如下。


以下是引用和指針之間的區別:

  • 需要取消引用指針,這由dereference(星型) operator *或類/結構成員的->完成,請參閱上面的代碼。
  • 而且你必須通過使用地址操作對象的地址&獲取一個指針。
  • 另一個區別是,引用不能為NULL它們必須有效,但指針可以指向NULL

const關鍵字的位置:

const關鍵字的位置決定了什么應該是常量,指針或指針所指向的對象。
一般來說,如果您只想到穿過* (星號)的垂直線,您可以更容易記住以下內容。 如果const位於*的左側,則它將應用於類型(對象),如果它位於右側,則它將應用於指針:

                |
BigObject       *        input /* pointer to BigObject             */
const BigObject *        input /* pointer to constant BigObject    */
BigObject const *        input /* same as before, I don't use this */
BigObject       * const  input /* constant pointer to BigObject    */
                |

你也可以結合起來使兩者保持不變:

                |
const BigObject * const  input /* constant pointer to constant BigObject */
                |

const關鍵字的位置與引用無關。 引用始終是常量 (這是隱式的而不是顯式命名的),意味着它一旦設置就無法引用另一個對象。 然而,該對象是可變的。 這意味着&右側的const關鍵字將是多余的,不會改變任何東西,只是不要使用它。 你應該區別對待:

BigObject&        input /* reference to BigObject           */
const BigObject&  input /* reference to constant BigObject  */
BigObject const & input /* same as before, I don't use this */

解決方案很簡單:將指向const的指針傳遞給函數(或者,或許引用更合適)。 該函數將無法通過指向const的指針修改對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM