98

const ポインターに関する基本的な質問があります。const ポインターを使用して非 const メンバー関数を呼び出すことはできません。ただし、const ポインターでこれを行うことは許可されています。

delete p;

これは、本質的に非定数の「メソッド」であるクラスのデストラクタを呼び出します。なぜこれが許可されているのですか?これをサポートするだけですか:

delete this;

それとも他に何か理由があるのでしょうか?

4

5 に答える 5

120

それはサポートすることです:

// dynamically create object that cannot be changed
const Foo * f = new Foo;

// use const member functions here

// delete it
delete f;

ただし、問題は動的に作成されたオブジェクトに限定されないことに注意してください。

{
 const Foo f;
 // use it
} // destructor called here

const オブジェクトでデストラクタを呼び出すことができない場合、const オブジェクトをまったく使用できませんでした。

于 2009-04-16T08:21:21.280 に答える
53

このように言えば、許可されていない場合、const_cast を使用せずに const オブジェクトを削除する方法はありません。

意味的には、const はオブジェクトが不変であることを示します。ただし、オブジェクトを削除してはならないという意味ではありません。

于 2009-04-16T08:22:26.053 に答える
5

コンストラクタとデストラクタは「メソッド」と見なされるべきではありません。これらは、クラスのオブジェクトを初期化および破棄するための特別な構造です。

「constポインタ」は、オブジェクトが生きている間に操作が実行されても、オブジェクトの状態が変更されないことを示します。

于 2009-04-16T08:30:32.240 に答える
5

別の見方をすると、 const ポインターの正確な意味は、そのポインターまたは他のポインターまたは同じオブジェクトへの参照を介して表示される、ポイント先のオブジェクトに変更を加えることはできないということです。ただし、オブジェクトが破棄されると、削除されたオブジェクトが以前に占有していたアドレスへの他のすべてのポインターは、そのオブジェクトへのポインターではなくなります。それらは同じアドレスを格納しますが、そのアドレスはもはやどのオブジェクトのアドレスでもありません (実際、すぐに別のオブジェクトのアドレスとして再利用される可能性があります)。

この違いは、C++ のポインターが弱い参照のように振る舞う場合、より明白になります。つまり、オブジェクトが破棄されるとすぐに、そのオブジェクトへのすべての現存するポインターが即座に に設定され0ます。(これは、すべての C++ プログラムに課すには実行時にコストがかかりすぎると考えられている種類のものであり、実際、完全に信頼できるものにすることは不可能です。)

更新: 9 年後にこれを読み返すと、弁護士っぽいです。あなたの最初の反応が理解できるようになりました。突然変異を許可せず、破壊を許可することは明らかに問題があります。const ポインター/参照の暗黙の契約は、それらの存在がターゲット オブジェクトの破棄、つまり自動ガベージ コレクションのブロックとして機能することです。

これに対する通常の解決策は、代わりにほとんどすべての他の言語を使用することです。

于 2009-04-16T13:47:30.693 に答える