29

これは非常に些細なことですが、チェコ語 (私の母国語) は暗黙的とデフォルトを区別しないため、暗黙的とデフォルトのコンストラクターまたはコンストラクター呼び出しの違いは何なのか、いくつかのチェコ語の翻訳に混乱しています。

struct Test {
  Test(int n=0) { }
};

次の用語で説明できますか:

  1. テスト t1;
  2. テスト t2();
  3. テスト t3 = 3;
  4. t4(4) をテストします。
  5. テスト t5 = テスト (5);

?

4

2 に答える 2

40

コンストラクターについて話すときのデフォルトおよび暗黙的な用語には、次の意味があります。

  • デフォルト コンストラクターは、引数なしで呼び出すことができるコンストラクターです。引数をとらないか、引数ごとにデフォルト値を設定します。

  • 暗黙のコンストラクターは、言語の 2 つの異なる概念について話すために一般的に使用される用語です。

    • ユーザー定義コンストラクターが提供されていない場合 (デフォルト)、またはコピー コンストラクターが提供されていない場合 (コピー)、すべてのユーザー クラスに対して宣言されるデフォルトまたはコピー コンストラクターである、暗黙的に宣言されたコンストラクター。つまり、ユーザーによってコンストラクターが宣言されていないクラスには、暗黙的に宣言された既定のコンストラクターが 1 つあります。

    • 暗黙的に定義されたコンストラクターは、言語で使用される ( odr-used 1であり、コンパイラーが定義を提供する)暗黙的に宣言されたコンストラクターです。

     

    struct test
    {
        test(int i = 0) { }
        // test(test const&) implicitly declared here
    };
    
    struct test2 { };      // implicitly declared: test2(), test2(test2 const&)
    
    int main()
    {
        test t;
    
        test copy(t);      // causes *definition* of the implicitly
                           // declared copy constructor
    
        test2 t2;          // causes *definition* of test2::test2()
    
        test2 copy2(t2);   // causes *definition* of test2::test2(test2 const&)
    }
    

簡単に言えば、引数なしで呼び出すことができる場合、コンストラクターはデフォルトです。コンストラクターは、ユーザーによって提供されずに宣言/定義されている場合、暗黙的 (宣言/定義済み)です。

具体的なケースとして:

Test t1;

Test(int = 0)暗黙的ではないデフォルトのコンストラクターを使用します。

Test t2();

Testこれは言語の奇妙な癖です。引数をとらず、オブジェクトを返す関数を宣言します。

Test t3 = 3;

これはコピー初期化と呼ばれ、変換の結果からの暗黙の*変換と from3Testコピー構築の合成に相当しt3ます。これはTest(int)、変換にコンストラクターを使用し、次に暗黙的に定義された(および宣言された) コピー コンストラクターを使用します。注: コンパイラはコピーを最適化して削除できますが、コピー コンストラクターが使用可能 (アクセス指定子) であり、定義できることを確認する必要があります。

Test t4(4);

Test(int)この場合、デフォルトのコンストラクターとして機能していないコンストラクターを使用します。

Test t5 = Test(5);

ケースと同等ですが、このケースでは からへTest t3 = 3の変換が明示的であるという唯一の違いがあります。この例では問題になりませんが、コンストラクターがこの行としてマークされていた場合、ケースが失敗する間にコンパイルされます。5Testexplicitt3


*) Implicit のさらに別の使用法。この場合、 からへの変換がコードで明示的に要求されていないという事実を指します。これを、プログラマーによって明示的に変換が要求された場所と比較してください。3Testt5Test(5)

于 2012-09-09T16:25:03.083 に答える
5

一部の用語を混同しているようです。デフォルトのコンストラクターは、パラメーターをとらないコンストラクターです。コンストラクターを直接呼び出すと、暗黙的な呼び出しになります。

ともかく:

1) t1 をテストします。

デフォルトのコンストラクタ。

2) t2() をテストします。

関数宣言。

3) t3 = 3 をテストします。

コピーの初期化。変換コンストラクターを呼び出し、一時的なTestfromを作成3し、コピー コンストラクターを使用して を作成しますt3

4) t4(4) をテストします。

直接初期化。変換コンストラクターを直接使用します。

5) テスト t5 = テスト (5);

コピーの初期化。3) と同様。

于 2012-09-09T15:16:17.457 に答える