簡體   English   中英

c ++在簽名中使用const的含義

[英]c++ meaning of the use of const in the signature

請幫我理解以下簽名:

err_type funcName(const Type& buffer) const;

所以對於第一個const,這是否意味着Type的內容不能改變或者引用不能改變?

其次,第二個const是什么意思? 我甚至都沒有暗示。

在此先感謝,jbu

第二個const意味着可以在const對象上調用該方法。

考慮這個例子:

class foo
{
public:
    void const_method() const;
    void nonconst_method();
};

void doit()
{
    const foo f;

    f.const_method();      // this is okay
    f.nonconst_method();   // the compiler will not allow this
}

此外,不允許const方法更改對象的任何成員(除非該成員被特別標記為可變):

class foo
{
public:
    void const_method() const;

private:
    int r;
    mutable int m;
};

void foo::const_method() const
{
    m = 0; // this is okay as m is marked mutable
    r = 0; // the compiler will not allow this
}

是的,第一個const表示buffer無法更改。

第二個const意味着這是一個類的成員函數,並且不會更改對象( this )。

這將比我們大多數人解釋得更好,所以我不會重復: http//www.parashift.com/c++-faq-lite/const-correctness.html

直接:它表示const適用於調用該方法的實例。 您不能在非const對象上調用它。

const規則: const關鍵字修改左邊的東西,除非什么都沒有,在這種情況下它會修改它的右邊的東西。

因此,類型“const int”是一種特殊情況,與“int const”的含義相同。

將規則應用於方法時,您將獲得“<method> const”。 (這是一種延伸,但仍然有助於理解這種方式。)

其他示例(“從里到外讀取”),其中“id”是標識符,但可以在不更改類型的情況下刪除:

  • int const* id =指向常量int的指針
  • int* const id =指向int的常量指針
  • int const id[5] = 5x常量int的數組
  • int (*const id)[5] =指向5x int數組的常量指針

更常見的是, T const&T const*被一些人使用,因為它通過不需要特殊情況來保持一致性。 我更喜歡它,因為一開始的類型通常比知道它的常量更有幫助。

其他答案是正確的,但它具有更重要的意義。 這是你班級的合同,“通過調用此函數,你不會改變你的對象的狀態”。 人們對此有不同的解釋,有些人認為對象不會改變調用者的外觀,而有些人則認為對象在調用此函數時根本不會改變。

第一個const是保證函數不會改變buffer ,因此可以傳遞一個const緩沖區。

第二個const僅在用作類的方法時才有意義。 保證調用該方法對包含該方法的類沒有任何副作用。 本質上是一個保證,可以在const對象上安全地調用此方法。

雖然你已經得到了一些好的答案,但我認為有必要指出一個類可以包含mutable成員變量。 mutable成員是您總是被允許修改的成員,即使它是const對象的一部分。 這些通常用於記憶和緩存之類的事情,其中​​變量可以被修改而不會影響整個對象的用戶可見狀態。

暫無
暫無

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

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