- ベストアンサー
[C++]クラスの宣言と定義の違いって?
クラスの宣言と定義の違いってなになのでしょうか? 宣言(定義)とは具体的にどのような記載をいうのでしょうか? いろいろ調べてこうかなっというのを記載します。 私の中では、宣言はメモリの割り当てがなされていない、宣言はメモリの割り当てがなされるという認識です。 class CSubCalss : public CSuperClass { public: } ↑これが宣言 int main () { CSubCalss a; ←これが定義 return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
JIS X3014:2003の3.1 宣言及び定義では、次のように規定されています。 宣言は, 次の場合を除いて, 定義という。 - 関数本体を指定せずに関数を宣言している場合 - extern指定子又は<<結合指定>>を含んでいて, <<初期化子>>も<<関数本体>>も含んでいない場合 - クラス宣言の中で静的データメンバを宣言している場合 - 型定義宣言, <<using宣言>>又は<<using指令>>の場合 すなわち、クラス指定子は上記の例外に該当しませんので、常に定義ということになります。しかも、不完全型の場合も上記に挙がっていませんが、その後に定義でない例として記述されていますので、定義ではありません。また、定義というのは宣言の一種です。 簡単にいうと、クラスの宣言というのは、 class CSubClass; であり、定義というのは、 class CSubCalss : public CSuperClass { public: }; のことになります。 CSubClass a; というのは、オブジェクトaの定義であって、クラスCSubClassの宣言でも定義でもありません。
その他の回答 (3)
- bnosuke-x
- ベストアンサー率39% (43/110)
Cでの話ですが、たぶん他の言語でも同じだと思います。 定義 ---- 中身を書いて、名前を付ける。 宣言 ---- 名前や引数の型等だけをコンパイラに教える。 定義は、その実体を書いて、それを名前と結びつけています。 宣言は、実体はよその場所にあるけれども、こういう名前でこういうものだよ、とコンパイラに教えています。 宣言はそのソースファイルにないものを使う(例えばライブラリの使用や、ソースファイルを分割しての開発)ために必要な仕組みです。 関連事項として、間違った宣言を書いたとき、宣言とソースファイルの記述が合致していても、実際に結合するライブラリなどと食い違いがあると、コンパイル時ではエラーが出ず、結合時にエラーが出るというちょっとわかりにくいエラーが出ます。 今の開発環境ではあまりでないと思いますが。
お礼
お返事ありがとうございました。 定義 ---- 中身を書いて、名前を付ける。 宣言 ---- 名前や引数の型等だけをコンパイラに教える。 私も上記のような認識だったのですが、他の方々の意見からすると、こうとは一概にいえないような気がしてきました。まだ、はっきりわかっていないので、間違っているかもしれませんが。 回答ありがとうございました。
- MrBan
- ベストアンサー率53% (331/615)
ちなみに、JISX3014の言う「型定義宣言」というのは、 原文の「a typedef declaration」、typedefのことでここでは直接関係ありません。
- MrBan
- ベストアンサー率53% (331/615)
定義と宣言の意味は、CとC++では微妙に違うのですが、 C++の場合は「名前を導入する」のが宣言。 大抵の宣言は定義でもあるので、宣言だけってのは少ないです。 後述の規格書に条件が書いてあります。 > ↑これが宣言 提示のこれはクラスの定義です。そして宣言でもあります。 クラスの宣言だけという例はこうなります。 class CSubClass; > ←これが定義 これは、a の定義でもあり宣言です。 詳細は規格書の言語仕様を参照ください。 3.1 Declarations and definitions JIS版の無料閲覧は参考URLからJIS検索で「X3014(JISX3014)」を検索ください。
- 参考URL:
- http://www.jisc.go.jp/
お礼
お返事遅くなってすいません。 私の認識が違ったということで、教えていただけてためになりました。 調べる糸口をいただけたので、あとは紹介いただいた記事などで細かな内容を調査します。 ありがとうございました。
お礼
お返事遅くなってすいません。 定義というのは宣言の一種なんですか。 なには私の認識は結構まちがってそうなので、もう少し学習する必要がありがありそうですね。 具体例を例示していただいたので、C++では具体的な記述での識別はよくわかりました。 ありがとうございました。