この違いが最も重要なC ++についてお話します。
正しく述べているように、不変とは、オブジェクトが作成された後にオブジェクトがまったく変更できないことを意味します。もちろん、この作成は実行時に行われます。つまり、const
オブジェクトは必ずしもコンパイル時の定数ではありません。C ++では、(1)と(2)または(3)のいずれかを満たす場合、オブジェクトは不変です。
メンバー関数mutable
によって変更されたconst
メンバーは宣言されていません
宣言されています const
const
メンバー関数は、メンバーconst_cast
を変更するためにconst
修飾を削除するために使用しません
ただし、アクセス修飾子を検討することもできます。操作によって内部的にインスタンスが変更されても、パブリックインターフェイスを介して監視可能なインスタンスの状態に影響がない場合、オブジェクトは「論理的に不変」です。
そのため、C ++は不変オブジェクトを作成するために必要なツールを提供しますが、C ++のほとんどすべてのものと同様に、ツールは最小限で十分であり、実際に使用するには勤勉が必要です。インスタンスの状態は、必ずしもインスタンスメンバー変数に限定されるわけではありません。C++は参照の透過性を強制する方法を提供しないため、グローバルまたはクラスの状態も含めることができます。
const
C ++には、参照とポインターを修飾する別の機能もあります。const
基準は、非を参照することができるconst
オブジェクト。これは、使用する(一般的に必要または賢明ではないが)合法であるconst_cast
を通じてオブジェクトを変異させるconst
、基準とする場合にのみ場合、そのオブジェクトを非宣言されていますconst
。
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
そしてもちろん、const
オブジェクトを変更することは未定義の動作です:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
すべての言語に存在するわけではなく、すべての言語に可変性と不変性が存在するわけではないので、この言語を作動的にすることは適用できません。これらの概念が適用される場合にのみ、言語固有です。