クラスをnewでインスタンス化するメリットはありますか?
C++の入門書などを眺めていて、仮想関数を使うときはどんな場面だろうか。
とか、思っていて次に中々進めてないので質問しました。
回答よろしくお願いします。
環境:
Visual C++ Express Edition 2008
Windows Vista Home Basic
newでインスタンス化
Re:newでインスタンス化
クラスに限らず、「メモリを動的に確保する」ということはC/C++特有のメリットがあります。
例えば、普通に宣言(例えば自動記憶域期間)すると、スコープを抜けた時点で問答無用でなくなります。
また、宣言時に、インスタンス生成に必要な情報を揃えておく必要があります。
これに対して、動的確保を使う場合、生成・破棄のタイミングを自分で決めることができるので、処理の幅が広がります。
実行時まで生成に関する情報が定まらないインスタンスなどは、必然的にこの方法になるでしょうね(私はまだそのようなものを扱ってませんが)。
それから、これは仮想関数とも関係があるのですが、共通する基底クラスのポインタとしていろいろな派生クラスのポインタを保持することができます。
格納したポインタから仮想関数を呼ぶことで、派生クラスの(オーバーライドされた)メソッドを呼ぶことが出来ます。
例えば、普通に宣言(例えば自動記憶域期間)すると、スコープを抜けた時点で問答無用でなくなります。
また、宣言時に、インスタンス生成に必要な情報を揃えておく必要があります。
これに対して、動的確保を使う場合、生成・破棄のタイミングを自分で決めることができるので、処理の幅が広がります。
実行時まで生成に関する情報が定まらないインスタンスなどは、必然的にこの方法になるでしょうね(私はまだそのようなものを扱ってませんが)。
それから、これは仮想関数とも関係があるのですが、共通する基底クラスのポインタとしていろいろな派生クラスのポインタを保持することができます。
格納したポインタから仮想関数を呼ぶことで、派生クラスの(オーバーライドされた)メソッドを呼ぶことが出来ます。
Re:newでインスタンス化
> クラスに限らず、「メモリを動的に確保する」ということはC/C++特有のメリットがあります。
「メモリを動的に確保する」ということはCで学習してメリットも充分理解していましたが、
クラスだから、C++だからということで違うものと認識していました。
クラスでもC++でも変わりませんね。そうですよね
> 共通する基底クラスのポインタとしていろいろな派生クラスのポインタを保持することができます。
> 格納したポインタから仮想関数を呼ぶことで、...
C++の入門書にも書いてありました。今、意味が理解できました。
回答有難うございました。
「メモリを動的に確保する」ということはCで学習してメリットも充分理解していましたが、
クラスだから、C++だからということで違うものと認識していました。
クラスでもC++でも変わりませんね。そうですよね
> 共通する基底クラスのポインタとしていろいろな派生クラスのポインタを保持することができます。
> 格納したポインタから仮想関数を呼ぶことで、...
C++の入門書にも書いてありました。今、意味が理解できました。
回答有難うございました。