クラス分けについて質問です。
論文で次の行を読みました: C++ クラス宣言は、オブジェクトの外部インターフェイスをそのインターフェイスの実装と結合します。
では、C++ の外部インターフェイスとは何ですか? C ++にはインターフェイスの概念がありますか? これを理解する方法: C++ クラス宣言は、オブジェクトの外部インターフェイスをそのインターフェイスの実装と結合します。?
実装とは対照的に、API(つまり、パブリック関数のシグネチャ)、つまりプライベート関数とデータメンバーを参照していると思います。
class T
{
// Here are some private things.
// You might say that these are part of
// the class's implementation.
int x;
int y;
void foo();
void bar();
public:
// And here are some public things, that
// constitute the class's API or "interface",
// which is the mechanism by which you may
// interact with objects of this type.
void baz();
void boz();
};
それらがすべて、単一のクラス定義のすぐそこにどのように存在しているかに注意してください。「組み合わせ」。
ただし、使用する用語のレベルは論文の著者次第なので、最終的には論文の著者に尋ねる必要があります。おそらく、彼らは継承階層と抽象基本クラスについて話している可能性があります...ただし、C++クラス定義がそれらを実際の意味で「組み合わせる」という主張を合理化する方法を見つけることができません。
論文による定義は少し不正確だと思います。宣言、実装、定義、およびインターフェースという用語は、ある程度厳密に使用する必要があります。少し説明してみます。
まず第一に、クラス宣言はインターフェイスを指定しません。単にクラスが存在することを示します。たとえば、次のような宣言があります。
class my_class;
struct my_structure;
template<typename T> class X;
一方、クラス定義は、クラスのメンバー(関数とデータ) を宣言します。詳細にあまり入ることなく、引用した論文で使用されている意味での外部インターフェイスという用語は、大まかに「そのクラスのメンバーではない関数に属するコードによって、そのクラスのオブジェクトで何ができるかの仕様」を意味します。
クラス定義の例を次に示します。
class my_class
{
public:
void foo();
int bar(int x) const;
private:
void do_something();
int data;
};
あなたが言及した論文で使用されている外部インターフェースという用語は、ほぼ確実に公開インターフェースを指します。これは、public
可視性を持つクラスのすべてのメンバーのリストです。public
クラスのすべてのメンバー変数と関数は、 、protected
、またはの 3 つの可視性レベルのいずれかを持つことができますprivate
。ここでは詳しく説明しませんが、public
メンバー (データまたは関数) は、それ自体がクラスのメンバーではないprivate
関数からアクセスできるメンバーであり、メンバーはクラスのメンバーである関数からのみアクセスできるということで十分です。クラスのメンバー。のprotected
修飾子は継承に関連しており、質問に答えるためにカバーする必要はないと思います。
上記のクラスのpublic インターフェイスは、関数 foo() および bar() を宣言しますが、それらの実装、またはより正式な用語である定義をまだ指定していません。一般に、メンバー関数は必ずしもクラス定義で定義されているとは限りません ( の定義を見ただけでは、何が機能するかわかりませんよね?)。したがって、宣言の直後にメンバー関数の本体を記述しない限り、その関数の実装を指定するには、別のメンバー関数定義が必要です。my_class
foo()
my_class
void my_class::foo()
{
std::cout << "hello, i'm foo" << std::endl;
}
int my_class::bar(int x)
{
do_something();
x * 2 + 1;
}
void my_class::do_something()
{
std::cout << "doing something..." << std::endl;
}
これらの関数の可視性レベルが異なるため、クラス外部の関数からのクライアント コードは、関数およびmy_class
を呼び出すことができます。これらはインターフェイスに属していますが、として宣言されている関数 には属していないためです。例えば:foo()
bar()
public
do_something()
private
int main()
{
my_class c;
c.foo(); // OK!
c.do_something(); // ERROR!
}
クラスの外部からアクセスできる関数とできない関数があるという事実の背後にある理論的根拠は、「情報隠蔽」の名の下にある優れた設計原則にあります。クライアントに一連のサービスのみを公開し、それらのサービスが実際に実装される方法を隠すことによって(たとえば、 function が functionをbar()
呼び出す)、それらのサービスの実装で起こり得る内部変更からクライアント コードを保護する抽象化のレイヤーを作成します。private
do_something()
最後に、「 C++ クラス宣言は、オブジェクトの外部インターフェースをそのインターフェースの実装と結合する」という文の作者が実際に言いたいことは、クラスの定義から何についてのヒントを得ることができるかということだと思います。クラスがクライアントに公開するサービス (「外部インターフェイス」、つまり関数)と、これらのサービスを実現するために内部で使用される関数と変数 (「実装」、つまり関数とメンバー変数)public
private
です。
その文の解釈を最終的にお伝えするのに少し時間がかかった場合は申し訳ありませんが、いくつかの説明が必要だと感じました. とにかく、これは必然的にこの明確なトピックの簡単な要約にすぎません。これらの用語をすべてグーグルで検索するか、C++ に関する優れた本を購入すれば、より良い情報源を見つけることができると確信しています。
PS: また、正式には用語 (およびキーワード!)interface
は C++ で非常に具体的なものを意味することに注意してください。これには、純粋な仮想関数の概念を導入する必要があります。引用された文の「インターフェース」という言葉の意図した意味とは無関係である可能性が高いため、それを説明する場合ではないと思いました。
クラスのパブリック メンバーを外部インターフェイスとして表示できます。
interface
たとえば、Java にあるように、C++ にはありません。基本クラスを定義し、派生クラスによって実装する必要があるいくつかの仮想メンバー関数を定義することしかできません。
クラス宣言には、、public
およびprotected
/またはprivate
メンバーが含まれます。プロテクト メンバーとプライベート メンバーは「実装」の詳細と見なすことができますが、必ずしもそのパブリック インターフェイスの実装とは見なされません。
インターフェイスにはメソッドの宣言が含まれており、これはヘッダー ファイルにあります。このヘッダー ファイルは、このメソッドのコードが表示されるいくつかのソース ファイルと関連付けられています。たとえば、Eclipse CDT でクラスを追加する方法を確認できます。