0

編集:

この質問には答えがありません^^

変数を const として宣言することにより、その変数を変更する意図がないことをコンパイラーに示します。

「改変」とはどういう意味ですか?割り当てられた値を変更しますか? 複合オブジェクトの場合はどうなりますか? データ メンバーを変更するとどうなりますか (動作しません)、しかしデータ メンバーが参照の変更である場合は、含まれるオブジェクトが const であっても動作しますか? なんで?

「そのようなオブジェクトは変更できません」と「変数を const として宣言することにより、その変数を変更する意図がないことをコンパイラーに示します」ことを知っています。オブジェクトが基本型ではなく複合型であり、その値データ メンバーの他に参照とポインターもある場合の「変更」の意味に興味があります。

cppreferenceのみ

そのようなオブジェクトは変更できません

「オブジェクト」または「変更された」は、メモリ表現または何かに関連する専門用語ですか? 実験の結果、オブジェクト データ メンバがポインタまたは参照である場合、それらによって表されるデータを変更できることがわかりました。

class Vector {
public: 
    Vector () : ptr(new int[20]) {}

    void f() const {
        ptr[0] = 100;
    }
private:
    int* const ptr;
}; 

上記のコードはコンパイルconst Vector v;されint* const ptrます。

また、データ メンバーが参照である場合、参照が内部でどのように実装されているか (標準で指定されていない場合) を知っている人は、標準constに従って何をしますか?

私の答え:(コメントの情報にも感謝します)

オブジェクト const を宣言するとき

const MyObject obj();

また

__class definition__
private:
    const MyObject obj;

基本的に、メモリ内のオブジェクトの一部であるデータは変更できないと言います。サブオブジェクト (データ メンバー)、サブサブオブジェクトなどは、メモリ内のオブジェクトの直接の一部であることに注意してください。

したがって、複合オブジェクトでは、非複合型のみに降りるまで、「深い const」方法ですべてのメンバー定数も「マーク」します。

ただし、ポインターと参照はオブジェクトを格納するのではなく、メモリの場所のみを格納することに注意してください。したがって、ポインターの場合は定数ポインターを取得し、参照の場合は何も変更されません (ポインターが保持し、指すメモリ位置は常に一定です)。

複合オブジェクト const を宣言するとどうなるかを簡単にまとめます。

そのデータ メンバーの場合:

  1. オブジェクトはプリミティブ データ型です (ただし、非ポインターおよび非参照) -> 答え^^そこに
  2. オブジェクトはポインタです -> SomeObj* は SomeObj* const になります
  3. object は参照です -> SomeObj& は同じままです
  4. オブジェクトは複合データ型です -> すべてのメンバー const をこれらのルールで「マーク」します

参照のためにそのように設計されている理由は明らかではないかもしれませんが. したがって、参照を、どのような方法でも実装できるブラック ボックス タイプと考えるべきではありません。

参照は、参照のブラック ボックスではなく実装のみを念頭に置いて、かなり不変のポインタであると考える必要があります。そうしないと意味がありません。参照はポインターよりも値型に近くなく、ポインターです。構文的には値型に似ているかもしれませんが、意味的にも実装的にも定数ポインターです。

4

0 に答える 0