2017-09-16 34 views
1

C++の前方宣言とプロトタイプ宣言の違いは何ですか?そして、私はthisとAngewが、C++には2つの用語のどれも存在しないと主張していますが、実際には宣言だけです...しかし、 "前方宣言"を使わずに前方宣言と呼ばれることについてどう思いますか?私たちはこのコードを持っている場合と同じように:前方宣言とプロトタイプ宣言 "宣言"を呼び出すだけですか?

class B; 
class A{B b;}; 
class B{A a;} 

私はちょうど「Aの前に表示されるBの宣言」を言うなら、誰もが本当に私が後で定義されることになっているの宣言について話していますことを知っていることはできません。..だから私は正しいC++用語を使って、それについてもっと具体的にすることができますか?

プロトタイプ宣言についても同じです。この言葉は、単に宣言と言うよりも、より具体的な状況を説明することができます。

+1

'class B;'はStandardeseの "_elaborated-type-specifier_"という唯一の構成要素である宣言です。また、非公式に前方宣言として知られています。しかし、私はこの質問が主に意見に基づいていると思います。 – cpplearner

+0

'class B;'は宣言です。 'class A {B b;};'は定義です(しかし定義も宣言です)。 – Simple

+1

"前方宣言"が何であるかを知っている人はあなたを理解するでしょう。 Pascalと同じようにC++でも同じように動作しますが、いずれかの言語だけが 'forward'キーワードを持っていても同じです。 –

答えて

0

私が呼び出します。

class B; 

あなたの例では前方宣言を。これはBがクラスであることをコンパイラに通知します。これは、Bをさらに(今のところ)定義することなく、Bをいくつかの方法で参照するのに十分な情報です。これは、宣言または定義しているクラスを参照するクラスを参照する必要があるときに、ヘッダーファイル間の循環参照を解決する方法として使用できます。あなたの例のように、しかしAとBが異なるヘッダーファイルにあり、AヘッダーにAを、BヘッダーにBを含めることができないため、Bを前方宣言するとBが解決します)

関数本体に '宣言'がない場合は、関数宣言を呼び出します。ヘッダーファイルの関数を宣言し、cppファイルでそれらを定義すると、ヘッダーファイルには、ヘッダーファイルのすべての関数定義の手荷物がなくても、ヘッダーファイルのコンシューマーにとって十分な情報である宣言のみが含まれます。ヘッダーファイルに宣言と定義が混在していて、ヘッダーがプロジェクトに複数回含まれていると、重複した定義エラーが発生することがあります。

「プロトタイプ宣言」は実際には使用される用語ではないと私は思います。私は、「宣言」は「関数プロトタイプ」とも呼ばれるかもしれないと言います。それは古くからのCの言葉かもしれません。