15

プリミティブ型にはコンストラクターがないことが何度も再ハッシュされています。たとえば、これ_barは次の呼び出し時に 0 に初期化されませんFoo()

class Foo{
    int _bar;
};

したがって、明らかにint()コンストラクタではありません。しかし、その名前は何ですか?

この例では、次のようになりますi: (constructed? initialized? fooed?)

for(int i{}; i < 13; ++i)

Loki Asariは、このテクニックには何らかの名前があると述べています。

マイク・シーモアに応じて編集:

#include <iostream>

using namespace std;

class Foo{
    int _bar;
public:
    void printBar(){ cout << _bar << endl; }
};

int main()
{
    Foo foo;

    foo.printBar();

    Foo().printBar();

    return 0;
}

このコードを Visual Studio 2013 で実行すると、次の結果が得られます。

3382592
3382592

興味深いことに、gcc 4.8.1 では次の結果が得られます。

134514651
0

4

3 に答える 3

9

プリミティブ型にはコンストラクターがないことが何度も再ハッシュされています。

それは正しい。

たとえば、このバーは呼び出し時に 0 に初期化されませんFoo()

はい、そうです。Foo()値の初期化を指定します。これは、ユーザー提供のコンストラクターを持たないこのようなクラスの場合、メンバーを初期化する前にゼロで初期化されることを意味します。したがって_bar、値はゼロになります。(ただし、コメントに記載されているように、ある一般的なコンパイラは、そのようなクラスの値を正しく初期化しません。)

代わりに default-initialisation を使用すると、初期化されません。一時的にそれを行うことはできません。ただし、宣言された変数Foo f;またはオブジェクトnew Fはデフォルトで初期化されます。プリミティブ型のデフォルトの初期化は何もせず、不確定な値のままにします。

クラスにユーザー提供のデフォルト コンストラクターがあり、そのコンストラクターが特に初期化しなかった場合も初期化されません_bar。繰り返しますが、デフォルトで初期化され、何の効果もありません。

したがって、明らかに int() はコンストラクターではありません。しかし、その名前は何ですか?

式としては、 type の値で初期化された一時的なものintです。

構文的には、「明示的な型変換 (関数表記)」の特殊なケースです。しかし、その用語を型変換以外に使用すると、かなり混乱します。

この例では、次のようになりますi: (constructed? initialized? fooed?)

初期化しました。より具体的にしたい場合は、リスト初期化(空のリストを使用)、値初期化、またはゼロ初期化。

于 2014-12-12T12:29:16.313 に答える
-1

必要に応じて、デストラクタの用語を反映して、疑似コンストラクタと呼ぶことができます (疑似デストラクタの呼び出しについては、C++11 §5.2.4 で説明されています)。とにかく、int()type のデフォルト値int、つまり 0 です。

「プリミティブ型にはコンストラクターがない」という主張については、かなりばかげた非現実的な見方です。正式な観点から見ると、プリミティブ型にはコンストラクターがありませんが、その主張に固執する人は、正式なものにはまったく興味がありません。また、マシン コードの観点からはそうではありませんが、アサーションが重要であると考えている人にとって、マシン コードは魔法のようなものです。ただし、違いがあります。つまり、マシンコードの観点から見ると、一般的な非プリミティブ POD タイプにもコンストラクターがない可能性があるということです (正式にはコンストラクターがあります)。つまり、彼らには意見を持つ資格がないと思います。ほぼ同じ種類の考慮事項が、絶対的な用語の主張にも当てはまります。ほぼ確実に、

代わりに、プリミティブ型のコンテキストで「構築された」または「コンストラクター呼び出し」などを聞いた場合、意味のある意味を考えてください。形式は単なる定義の問題です。重要なのは、それが当然のことである言語弁護士の議論を除いて、機能する概念モデルを持つことです。


上記のすべてが述べたように、式T()は正式には「コンストラクター」ではなく、マシンコードレベルのコンストラクターではなく、意味のある概念モデルでは概念的にコンストラクターではありません。

コンストラクター呼び出しにすることもできます(実際、既定のコンストラクターの定義では、ソース コード レベルで引数なしで呼び出すことができます) が、コンストラクター呼び出しには文法カテゴリがないことに注意してください。

上記のすべてを念頭に置いて、コンストラクター呼び出しと呼びます。より正確にする必要がある場合は、プリミティブ型Tの場合、疑似コンストラクター呼び出しと呼びます


誰かが私を批判した場合、私は彼らに決闘を挑むだけです.


あなたの声明に関して、注意してください

プリミティブ型にはコンストラクターがないことが何度も再ハッシュされていますたとえば、このバーは呼び出し時に 0 に初期化されませんFoo()

Foo()は値の初期化を実行するため、インスタンス (この場合) はゼロになります。

初期化子のないプリミティブ型のローカル自動変数の初期化の一般的な欠如に関しては、ユーザー定義コンストラクターのない任意の型で同じ状況が発生し、そのコンストラクターが物事を初期化しない場合、使用されている定義済みコンストラクターがある場合でも同様です。

これは、C++ の初心者にとって衝撃的な場合があります。

于 2014-12-12T12:48:40.133 に答える