4

このコードがコンパイルされて実行される理由について、私は少し混乱しています。

class A
{
private:
    int* b;
public:
    A() : b((int*)0xffffffff) {}
    int* get_b() const {return this->b;}
};

int main()
{
    A a;
    int *b = a.get_b();
    cout<<std::hex<<b<<endl;
    return 0;
}

このコードを実行した場合の出力FFFFFFFFも...私には予想外です。constメンバー関数にあるのでthis->b戻るべきではありませんか?const int*したがって、この行は、にキャストしようreturnとするとコンパイラキャストエラーを生成するはずです。const int*int*

明らかに、constメンバー関数が何を意味するかについての私の知識にはギャップがあります。誰かが私がそのギャップを埋めるのを手伝ってくれるなら、私は感謝します。

4

4 に答える 4

4

いいえ、メンバーはint* const(const関数から見て)まったく異なります。

ポインタはconstであり、ポイントされたオブジェクトではありません。

于 2011-04-27T15:03:14.737 に答える
2

メンバー関数の一部は、ポインター(別名、呼び出されるオブジェクト)がconstであるconst場合に、関数の呼び出しが許可されることを示しています。this戻り値とは何の関係もありません。

class A{
public:
  void non_const_func(){}
  void const_func() const {}
};

int main(){
  A a;
  a.const_func(); // works
  a.non_const_func(); // works too

  const A c_a;
  c_a.const_func(); // works again
  c_a.non_const_func(); // EEEK! Error, object is const but function isn't!

}

于 2011-04-27T15:02:00.860 に答える
2

この関数は、値によって整数ポインターを返します。この値を介してコピーされたクラスメンバーを変更することはできないため、const違反はありません。

于 2011-04-27T15:02:37.987 に答える
0

あなたが持っているように関数宣言の後に置くconstと、コンパイラに「ねえ、私は変更しないことを約束します*this!」と伝えます。あなたのメソッドは単なるアクセサーです。

C ++ FAQLITE18.10を参照してください

于 2011-04-27T15:07:36.063 に答える