web-dev-qa-db-ja.com

組み込み型にはデフォルトのコンストラクタがありますか?

this の記事を読んだ後、一時的なintは初期化された値であるため、int ()がデフォルトを呼び出すためではなく、int()が0を生成することを指摘しました。 intのコンストラクタ。 (私の理解によると、記事に欠陥があります。)

また、プリミティブ(組み込み)型にはコンストラクターがないことも述べました。元の作者はセクション10.4.4.2(TC++ PL)をチェックするように私に頼んだ

組み込み型にはデフォルトのコンストラクターもあります($ 6.2.8)

しかし、「C++では組み込み型(プリミティブ型)でもデフォルトのコンストラクターを持つことができる」という記述はまだあると思います。欠陥がある(C++ 03による)。

TC++ PLのBjarneは「コンストラクタのような表記、つまり() "と実際のコンストラクター呼び出し。値の初期化は、Bjarneが本を書いているときに導入されていませんでしたか?それで、C++ 98とC++ 03に従って、TC++ PLのテキストは正しくありませんか?

皆さんはどう思いますか?

[〜#〜]編集[〜#〜]

TC++ PLの欠陥のあるテキストについてBjarneに個人的に(メールで)尋ねましたが、これは彼の返信でした

「実際のコンストラクター呼び出し」と概念的にコンストラクターを持つことは混同していると思います。 組み込みの型は、コンストラクターを持つと見なされます(標準で動作を説明するために使用される単語はすべて)。

44
Prasoon Saurav

コンストラクターはメンバー関数です(コンストラクターは、コンストラクターやデストラクターなどの特別なメンバー関数を対象とするC++標準の12節で完全に指定されています)。

メンバー関数は、クラス型に対してのみ定義できます(C++ 03 9.3/1は、「クラスの定義で宣言された関数(フレンド指定子で宣言された関数を除く)は、そのクラスのメンバー関数と呼ばれる」と述べています)。

したがって、非クラス型(基本型、配列型、参照型、ポインター型、列挙型を含む)にはコンストラクターがありません。

「組み込み型にもデフォルトのコンストラクターがある」という引用のコンテキストを読むためのC++プログラミング言語のコピーはありませんが、Stroustrupが「緩やかな、非技術的な意味での「コンストラクタ」、または用語の意味、または標準での使用方法が、本が出版されたときと言語が標準化されたときとの間で変わった。前者は後者よりもはるかに可能性が高いと思います。

25
James McNellis

簡単な答え:技術的には違います。

長い答え:

番号。
Butそれらを初期化するために使用する構文により、デフォルトのコンストラクターまたはデフォルトのコピーコンストラクターによって構築されているように見えます。

int x(5);  // Looks like a constructor. Behaves like one: x is initialized.
int y();   // Fail. Actually a function declaration.
// BUT
int z = int(); // Looks like a constructor. Behaves like a constructor (0 init).

int a(b);  // Again.

したがって、技術的には基本的なPODタイプのコンストラクタはありません。しかし、すべての意図と目的のために、それらはコピーコンストラクターと既定のコンストラクター(中かっこで初期化された場合)と同じように動作します。

それがアヒルのように見え、アヒルのように鳴く場合、そのアヒルはとても好きです。

48
Martin York

他の人が指摘したように、標準はいくつかの例でTC++ PLと矛盾し、多くの場合用語に関連しています。 Bjarne Stroustrup自身は状況をうまく要約しています:

(...)ただし、[TC++ PL]はリファレンスマニュアルでも標準テキストでもありません。100%正確で完全な情報が必要な場合は、 ISO C++標準のテキストを参照してください。(...)

5
decltype