- ベストアンサー
クラス メンバ関数インライン化
クラス内でメンバ関数を定義するとインライン関数になると書いてあったのですが、全てクラス内でメンバ関数を定義してはだめなのでしょうか? クラス外でメンバ関数を定義するメリットを教えてください。 教えてくださいm(_ _ )m
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>クラス外でメンバ関数を定義するメリットを教えてください。 一言で言えば、オブジェクト指向の特長の一つである「カプセル化」を効果的に行えます。 小規模で単純な構造のプログラムならば、C++のクラス定義を使うメリットはあまりなく、C言語の文法で十分です。 クラス定義のメリットが生きてくるのは、プログラムの規模が大きくなってきたときです。 ・クラスを複数の場所で使いまわす(再利用) ・プログラムを複数の人で分担して開発する ・モジュール化することで、全体の規模が大きくなっても開発・保守しやすい構造にする これらのためには、クラスを外部から使う時のインターフェース(クラス定義)と、クラスの内部の実装(メンバ関数の実装)を分離し、クラスを外部から使う時は、インターフェースのみを意識すれば良いようにしておく方が得策です。 クラス内でメンバ関数を定義してしまうと、インターフェースとその実装が一つの場所に混在することになってしまい、例えばクラスを外部から使いたいだけなのに、その際に見る必要のない、メンバ関数の実装が大量に書かれている中から、インターフェースに相当する情報を読み取らなければならず、作業の効率が落ちてしまいます。クラスの全体構造を理解することも大変になりますし、その過程でミスが入り込む(バグの原因)リスクも高くなります。 また、クラスをライブラリとして配布する場合に、メンバ関数の実装はコンパイル済みのライブラリ、インターフェースは、メンバ関数の宣言のみを含むクラス定義のヘッダファイルとして配布することで、実装のソースコードを見せずに配布することができますし、勝手に実装が変更されて不具合の原因になるような事故を防ぐことができます。 なお、 >クラス内でメンバ関数を定義するとインライン関数になると書いてあったのですが これは、正確には少し違っていまして、メンバ関数宣言にinlineのキーワードをつけておくと、これがコンパイラへの「ヒント」になるだけです。 コンパイルの際に、実際にインライン展開されるか否かは、コンパイラ次第で、必ずインライン展開されるとは限りません。 メンバ関数の実装内容によっては、原理的にどうやってもインライン展開できない場合もあります。 インライン展開されると、関数の呼び出しオーバーヘッドがなくなる分、処理は高速になりますが、その一方で実行コードの量は増え、メモリは多く消費します。 どちらが良いかはケースによりますが、現在の非常に高性能なプロセッサで、これが処理速度の差となって現れるケースは非常に限られていると思います。 逆にインラインで書くことは、コードの保守性を下げる原因になりますので、基本的にはむしろ、むやみにやらない方が良いでしょう。
お礼
詳しい説明ありがとうございます。m(_ _ )m