2009-04-16 12 views
72

私はconstポインタに関する基本的な質問があります。 constポインタを使用して非constメンバー関数を呼び出すことは許可されていません。しかし、私はのconstポインタでこれを行うさせて頂いております:const(T const *)へのポインタの削除

delete p; 

これは、本質的に非const「メソッド」ですクラスのデストラクタを呼び出します。これはなぜ許可されていますか?

delete this; 

他にもいくつかの理由がありますか?

答えて

90

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

// 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オブジェクトで呼び出すことができなかった場合まったく。

+17

最新の編集内容は+1です。私はこれが本当の理由だと思う。 constオブジェクトの自動デストラクタ呼び出し - delete fとほとんど同じです。ここで、f - constのポインタ。 – bayda

37

でない場合、const_castを使用せずにconstオブジェクトを削除する方法はありません。

意味的には、constはオブジェクトが不変でなければならないことを示します。しかし、それはオブジェクトを削除すべきでないことを意味するものではありません。

+0

デストラクタはかなり暴力的な方法でオブジェクトを変異させることができるので、これは私がこれまで知らなかった「不変」という言葉の奇妙な使い方でなければなりません... – DarthGizka

5

コンストラクタとデストラクタを 'メソッド'として表示しないでください。それらは、クラスのオブジェクトを初期化して解体する特別な構造です。

'constポインタ'は、オブジェクトが動作中に操作が実行されたときにオブジェクトの状態が変更されないことを示すためのものです。

4

これを見る別の方法:constポインタの正確な意味は、そのポインタや他のポインタや同じオブジェクトへの参照を介して表示されるポインティング先のオブジェクトに変更を加えることができないことです。しかし、オブジェクトが破棄されると、今削除されたオブジェクトによって占有されていたアドレスへの他のすべてのポインタは、そのオブジェクトへのポインタではなくなります。彼らは同じアドレスを保存しますが、そのアドレスはもはやオブジェクトのアドレスではありません(実際には別のオブジェクトのアドレスとしてすぐに再利用されるかもしれません)。

この区別は、C++のポインタが弱い参照のように動作した場合、つまりオブジェクトが破棄されると即座にすべての現ポインタが0に設定される場合に、より明白になります。 (これは実行時にすべてのC++プログラムに課すには高価すぎると考えられています。実際には完全に信頼できるものにすることは不可能です。)

6

非constメンバーを呼び出すことはできませんconstポインタを使った関数

はいです。

class Foo 
{ 
public: 
    void aNonConstMemberFunction(); 
}; 

Foo* const aConstPointer = new Foo; 
aConstPointer->aNonConstMemberFunction(); // legal 

const Foo* aPointerToConst = new Foo; 
aPointerToConst->aNonConstMemberFunction(); // illegal 

constオブジェクトへのconstポインタと、constオブジェクトに対する非constポインタを混同しています。

delete aConstPointer; // legal 
delete aPointerToConst; // legal 

それはすでにここに他の回答で述べた理由のために、どちらか削除する法的だ、と述べました。

関連する問題