10

私はプログラミングの原則と c++ (Bjarne Stroustrup)を使用した実践を読んでいます。

9.4.4 メンバー関数の定義、ページ 312、それは言う

1.

クラス定義内にメンバー関数の定義を記述すると、2 つの効果があります...

2.

あなたがそれを知っていない限り、クラス宣言にメンバー関数本体を入れないでください...

作者が書き間違えた?同じことについて話しますが、なぜ最初の文が「クラス定義」で2番目が「クラス宣言」なのですか?

ありがとう

4

3 に答える 3

13

作者が書き間違えた?

間違いではありませんが、不正確です。クラス宣言は、次のような前方宣言にすることができます。

class X;

これにより、コンパイラはそのクラスの存在を認識できるようになりますが、クラスが持つメンバーや基本クラスなどは指定されません (これがクラス定義の役割です)。

ただし、宣言は次のように定義にすることもできます。

class X
{
    // ...
};

ある意味で、定義は宣言でもあるので、その文は間違っていません。

宣言とは、定義ではない宣言を意味するという常識的な仮定の下では、この文は間違っていますが、そのような用語を扱うときは、正式な定義を念頭に置いたほうがよいでしょう。

于 2013-06-02T13:45:37.227 に答える
0

OOP 言語のさまざまな観点から見ると、インターフェイスはメソッドを含むクラスの宣言を意味します。C++ では、これをヘッダー ファイルに入れることができます。クラスの実装とは、このクラスのメソッドの実装を意味します。たとえば Java では、実装されているメソッドと実装されていないメソッドがある抽象クラスを使用できます。ただし、抽象クラスまたはインターフェイスはインスタンス化できません。

于 2013-06-02T14:33:20.340 に答える
-1

クラス宣言は、クラスを宣言する場所です。またはとして

C++ 標準セクション 3.1 から:

宣言は、名前を翻訳単位に導入するか、以前の宣言によって導入された名前を再宣言します。宣言は、これらの名前の解釈と属性を指定します。

本質的に、宣言は、特定の名前を持つ特定のオブジェクト、変数などが存在することをコンパイラーに伝えます。コンパイル単位に複数の宣言がある場合があります

ある意味で

class X; // is declaration also known as forward declaration.

単なる宣言です。ただし、オブジェクト/変数ごとに常に 1 つだけ定義する必要があります。そして、定義は基本的に、そのクラス/オブジェクト/構造体/変数などのインスタンスを作成するためにコンパイラが必要とするすべてのものです.

C++ では、多くの場合、クラス宣言は定義または部分定義にすることもできます/

//declare a class and declare it's members.
class X { //declares X and starts to define it
   void test ();  //declare test method
   int b;         // declare b member
}

完全な定義は、次のように .cpp ファイルに含めることができます。

void X::test() {
  //test code
}

または、次のようなクラス宣言で:

   class X {
      void test () {
         //test code
      }

違いに関する広範なスタックオーバーフローの議論は次のとおりです。

定義と宣言の違いは何ですか?

著者は、クラス定義内でメソッドを宣言および定義する 2 番目のタイプの宣言を使用しないで、別の C++ ファイルで使用することを推奨していると思います。これは、C++ の定義は 1 回だけという規則のためです。複数のファイルから同じ .h ファイルをインクルードしたり、同じクラスに複数の定義を含めたりすることは望ましくありません。

分離する必要がある理由に関する別の広範な議論を次に示します。

C++ クラスの定義をヘッダー ファイルに入れるのは良い方法ですか?

于 2013-06-02T14:05:27.277 に答える