48

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

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

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

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

TC ++ PLのBjarneは、「表記法のようなコンストラク()ター」と実際のコンストラクター呼び出しを混同していると思います。Bjarneが本を書いていた当時、値の初期化は導入されていませんでしたね。では、C++98およびC++03のように、TC ++ PLのテキストは正しくありませんか?

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

編集

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

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

4

3 に答える 3

49

簡単な答え:技術的にはありません。

長い答え:

いいえ 、でも!

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

int x0(5);     // Looks like a constructor. Behaves like one: x is initialized.
int x1{5};

int y0();      // Fail. Actually a function declaration.
// BUT
int y1{};      // So new syntax to allow for zero initialization
int z0 = int();// Looks like a constructor. Behaves like a constructor (0 init).
int z1 = int{};

int a0(b);     // Again.
int a1{b};

したがって、技術的には、基本的なPODタイプのコンストラクターはありません。ただし、すべての目的と目的で、コピーコンストラクターとデフォルトコンストラクター(中括弧で初期化されている場合)があるのと同じように動作します。

それがアヒルのように見え、アヒルのように鳴くなら、その非常にアヒルのようです。

于 2011-02-25T03:55:03.500 に答える
30

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

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

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

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

于 2011-02-25T03:46:15.490 に答える
5

他の人が指摘しているように、標準はいくつかの例でTC ++ PLと矛盾し、多くの場合用語に関連しています。ビャーネ・ストロヴルプ自身が状況をうまく要約しています。

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

于 2011-02-25T06:57:00.293 に答える