メンバー関数が、それらが属するクラスの内部とクラスの外部の両方でプログラムされ、クラス内に関数プロトタイプがあるのを見てきました。私は最初の方法だけを使ってプログラムしたことがありますが、他の方法を使用する方が良い方法なのか、それとも単に個人的な好みなのか疑問に思っていましたか?
8 に答える
C++ を意味すると仮定すると、関数をクラス内に配置すると、コンパイラがインライン化を試みる可能性があるため、常に望ましいとは限らないため、クラスの外で関数を定義することをお勧めします。
- コード サイズの増加 (このヘッダーを含むすべてのオブジェクト ファイルは、コード内に関数のコピーが作成される可能性があります)。
- 関数定義が変更されると、バイナリ互換性が失われます。
インライン関数であっても、関数が自明なアクセサーまたはその他のワンライナーでない限り、クラスのパブリック インターフェイスの可読性を向上させるために、通常はクラスの外に定義を配置することをお勧めします。
C++ の場合、メソッド定義をヘッダー ファイルに入れるということは、ヘッダーが変更されたときに、特定のヘッダーを含むすべてのものを再コンパイルする必要があることを意味します (それが単なる実装の詳細であっても)。
ヘッダーから定義を移動するということは、ヘッダー自体が変更された場合 (関数の追加/削除、または宣言の変更) にのみ、ヘッダーを含むファイルを再コンパイルする必要があることを意味します。これは、複雑なプロジェクトのコンパイル時間に大きな影響を与える可能性があります。
クラスを定義するときに両方のスタイルを混在させることも一般的です。1 行または 2 行で構成される単純なメソッドの場合、クラス定義内でメソッド本体を定義するのが一般的で便利です。より長いメソッドについては、これらを外部で定義することをお勧めします。メソッド本体で混乱することなく、より読みやすいクラス定義が得られます。
メソッドの実装を非表示にすることは、クラスのユーザーが実際の実装に気を取られたり、後で変更される可能性のある実装について推測したりしないという点で有益です。
どちらの手法にも利点があります。
クラス定義にプロトタイプのみを配置すると、そのクラスを使用している誰かが利用可能なメソッドを簡単に確認できます。実装の詳細に気を取られることはありません。
コードをクラス定義に直接配置すると、クラスの使用が簡単になります。ヘッダーを #include するだけで済みます。これは、テンプレート化されたクラスで特に役立ちます (必要です)。
言語が C++ であると仮定すると、次のようになります。
肝心なのは、それは個人的な好みです。クラス内は全体的に短く、より直接的です。
int getFoo() const { return _foo; }
関数のタイプ。クラス外では、クラス定義から「混乱」を取り除くことができます。
どちらも使用しているのを見た...
もちろん、インライン化されていない関数は常にクラスの外にあります。
繰り返しになりますが、C ++を想定すると、通常、これを仮想関数のプレースホルダーに制限します。
virtual int MyFunc() {} // Does nothing in base class, override if needed
それ以外の場合、Andrew Medicoのポイントは簡単に開始され、コンパイル時間が長くなります。
クラス内に関数を実装する場合、クラスを複数の .cpp ファイルに #include することはできません。そうしないと、関数の複数の定義についてリンカからエラーが発生します。
したがって、通常はクラス定義を .h ファイルに、メンバーの実装を .cpp ファイル (通常は同じ名前) に格納します。
あなたはC++について話していると思います。
素晴らしくきれいなインターフェースを持つことは、確かに良い考えです。別の実装ファイルを用意すると、インターフェースをきれいに保つのに役立ちます。
特に不透明なポインターを使用している場合は、コンパイル時間も短縮されます。