15

重複の可能性:
C++ では、ヘッダー ファイルと cpp ファイルがあるのはなぜですか?

次の 2 つの矛盾する理由により、C++ ヘッダー ファイルを取得できません。

  1. 一般に、ヘッダー ファイルの目的は、インターフェイスと実装を分離することだと思いました。つまり、クライアントはヘッダー ファイルを使用してクラスの使用方法を学習しますが、クラスが実際にこの機能を内部でどのように実装するかについて心配する必要はありません。

  2. では、C++ クラスのプライベート変数がヘッダー ファイルで指定されるのはなぜでしょうか。

ヘッダー ファイルにプライベート変数を含めると、インターフェイスと実装の分離に違反するように思えます。直観的には、プライベート変数がソース ファイルにある方が理にかなっていると思います。なぜなら、これは外部に公開されていないファイルだからです。

ヘッダーファイルの目的を誤解しているだけかもしれません.1.上記は完全に間違っていますか? どんな風に?

4

4 に答える 4

12

C++ ヘッダー ファイルの主な機能上の目的は、C++ 言語には、他の言語に存在するモジュール インポートや類似のものがないことです。コンパイラが他のファイルの型、関数などを知る唯一の方法は、#include.

理論的には、すべてのソース コードをヘッダーに配置して、すべてのヘッダーを含む 1 つのソース ファイルを作成することもできます。これが通常行われない理由は 2 つあります。まず、コンパイルに時間がかかり (一部のプロジェクトでは重大な懸念事項)、ファイルを変更すると、プロジェクトが完全に再コンパイルされます。第 2 に、実装をソース ファイルに入れると、実装の一部がまだヘッダー ファイルで指定されている場合でも、インターフェイスを実装から分離するのに実際に役立ちます。

ヘッダー内のインライン メソッドも、クラスのパブリック/クライアントに公開されている実装の詳細の細かい行をたどることに注意してください。

インターフェイスを実装から完全に分離したい場合 (これには明確な利点があります)、C++ で行う方法は pimpl イディオムを利用することです。このイディオムを使用すると、すべてのプライベート データがソース ファイルに隠され、抽象的なインターフェイスのみがパブリックに提供されます。さらに、非仮想インターフェイス (NVI) パターンを使用すると、インターフェイスの変更からクライアントを分離するのにさらに役立ちます。

于 2012-07-17T17:31:08.750 に答える
10

C++ では、関数とクラスの宣言と定義が区別されます。一般に、C++ ヘッダー ファイルにはクラスの宣言が含まれています。部分的な宣言は許可されていないため、ヘッダー ファイルには、すべてのプライベート メンバー (変数とメンバー関数) を含む完全なクラス宣言を含める必要があります。

完全な実装を公開しないようにしたい場合は、pimpl イディオムを使用してこれを実現できます。

于 2012-07-17T17:30:58.440 に答える
7

ヘッダー ファイルの目的は、コンパイル単位 (.cpp ソース ファイル) 間で定義を共有するために必要な情報をコンパイラに提供することです。これは機械的なものであり、哲学的なものではありません。

たとえば、プライベート メンバー変数はオブジェクトのサイズを定義するため宣言する必要があり、コンパイラはオブジェクトを割り当てるときにサイズを知る必要があります。

于 2012-07-17T17:35:54.220 に答える
0

C/C++ では、ヘッダー ファイルの目的の 1 つは、複数のファイル間で定義を複製することなく、複数の翻訳単位が同じ定義の型を使用できるようにすることです。クラスの定義の一部は、そのプライベート メンバーです。

于 2012-07-17T17:32:35.180 に答える