私はconstポインタに関する基本的な質問があります。 constポインタを使用して非constメンバー関数を呼び出すことは許可されていません。しかし、私はのconstポインタでこれを行うさせて頂いております:const(T const *)へのポインタの削除
delete p;
これは、本質的に非const「メソッド」ですクラスのデストラクタを呼び出します。これはなぜ許可されていますか?
delete this;
他にもいくつかの理由がありますか?
私はconstポインタに関する基本的な質問があります。 constポインタを使用して非constメンバー関数を呼び出すことは許可されていません。しかし、私はのconstポインタでこれを行うさせて頂いております:const(T const *)へのポインタの削除
delete p;
これは、本質的に非const「メソッド」ですクラスのデストラクタを呼び出します。これはなぜ許可されていますか?
delete this;
他にもいくつかの理由がありますか?
それはサポートすることです:
// 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オブジェクトで呼び出すことができなかった場合まったく。
がでない場合、const_castを使用せずにconstオブジェクトを削除する方法はありません。
意味的には、constはオブジェクトが不変でなければならないことを示します。しかし、それはオブジェクトを削除すべきでないことを意味するものではありません。
デストラクタはかなり暴力的な方法でオブジェクトを変異させることができるので、これは私がこれまで知らなかった「不変」という言葉の奇妙な使い方でなければなりません... – DarthGizka
コンストラクタとデストラクタを 'メソッド'として表示しないでください。それらは、クラスのオブジェクトを初期化して解体する特別な構造です。
'constポインタ'は、オブジェクトが動作中に操作が実行されたときにオブジェクトの状態が変更されないことを示すためのものです。
これを見る別の方法:constポインタの正確な意味は、そのポインタや他のポインタや同じオブジェクトへの参照を介して表示されるポインティング先のオブジェクトに変更を加えることができないことです。しかし、オブジェクトが破棄されると、今削除されたオブジェクトによって占有されていたアドレスへの他のすべてのポインタは、そのオブジェクトへのポインタではなくなります。彼らは同じアドレスを保存しますが、そのアドレスはもはやオブジェクトのアドレスではありません(実際には別のオブジェクトのアドレスとしてすぐに再利用されるかもしれません)。
この区別は、C++のポインタが弱い参照のように動作した場合、つまりオブジェクトが破棄されると即座にすべての現ポインタが0
に設定される場合に、より明白になります。 (これは実行時にすべてのC++プログラムに課すには高価すぎると考えられています。実際には完全に信頼できるものにすることは不可能です。)
非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
それはすでにここに他の回答で述べた理由のために、どちらか削除する法的だ、と述べました。
最新の編集内容は+1です。私はこれが本当の理由だと思う。 constオブジェクトの自動デストラクタ呼び出し - delete fとほとんど同じです。ここで、f - constのポインタ。 – bayda