このステートメントはどのように定義されていますか? 構造体の日付型のオブジェクトを定義するまでメモリを割り当てないので、宣言だけのはずではありませんか?
struct Date { int d , m , y ; };
私は Bjarne Stroustrup による「C++ プログラミング言語」という本を読んでいます。この本では (セクション 4.9 で) これは定義であると同時に宣言であると述べられています。
このステートメントはどのように定義されていますか? 構造体の日付型のオブジェクトを定義するまでメモリを割り当てないので、宣言だけのはずではありませんか?
struct Date { int d , m , y ; };
私は Bjarne Stroustrup による「C++ プログラミング言語」という本を読んでいます。この本では (セクション 4.9 で) これは定義であると同時に宣言であると述べられています。
struct Date; // forward declaration
struct Date{ int d, m, y; }; // class definition (struct is a class-key)
ISO 14882:98 9.1-1 および -2 クラス定義も参照してください。
どちらの言語のステートメントでもありません。C99 は 6.8 でステートメントを定義し、C++11 は 6.でステートメントを定義します。
Cでは、それは定義ではなく、宣言のみです.C99の6.7/5は次のように述べています:
識別子の定義は、次のような識別子の宣言です。 — オブジェクトの場合、そのオブジェクト用にストレージが予約されます。—関数の場合、関数本体が含まれます。— 列挙定数または typedef 名の場合、識別子の (唯一の) 宣言です。
これはこれら 3 つのいずれでもないため、識別子の定義ではありません。C99 文法では、これは構造体または共用体指定子(セミコロンが続きます) であり、これは宣言の許可された形式の 1 つである型指定子(セミコロンが続きます) です。 (6.7/1)。
C++ では、それはクラス指定子またはクラス定義です: C++11 の 9/2 は言う
クラス指定子は、一般にクラス定義と呼ばれます。
C と C++ の両方で、「すべての定義は宣言である」と言うのが一般的です。そのため、Stroustrup は、定義であると同時に宣言でもあると言っているのでしょう。
C では、上記の「定義」の定義により、これは厳密に当てはまります。C++ では、クラス指定子が宣言であるというのは実際には文法上正しくないと思いますが、クラス定義は完全な型を導入し、クラス宣言は不完全な型を導入します。不完全な型でできることは完全な型でもできないので、クラス定義は のようなクラス宣言と「同等」struct Date;
であり、それよりも優れています。
struct Date
これは、 C およびDate
C++での新しい型の宣言です。宣言は声明ではありません。また、新しい型の宣言用に予約されるメモリはありません。
タイプを宣言しDate
ます。Date
s メンバーを定義するため、作成するオブジェクトのサイズを定義します。
メソッドが宣言されていないため、クラスを完成させるために他に何かを定義する必要はありません。
また、コンストラクタ、デストラクタ、代入演算子などを宣言または定義しない場合、C++ はそれらを自動的に合成しようとします。したがって、この の最小限の定義にDate
は、デフォルトのコンストラクター、代入演算子、およびデストラクターが含まれます。