これは非常に些細なことですが、チェコ語 (私の母国語) は暗黙的とデフォルトを区別しないため、暗黙的とデフォルトのコンストラクターまたはコンストラクター呼び出しの違いは何なのか、いくつかのチェコ語の翻訳に混乱しています。
struct Test {
Test(int n=0) { }
};
次の用語で説明できますか:
- テスト t1;
- テスト t2();
- テスト t3 = 3;
- t4(4) をテストします。
- テスト t5 = テスト (5);
?
これは非常に些細なことですが、チェコ語 (私の母国語) は暗黙的とデフォルトを区別しないため、暗黙的とデフォルトのコンストラクターまたはコンストラクター呼び出しの違いは何なのか、いくつかのチェコ語の翻訳に混乱しています。
struct Test {
Test(int n=0) { }
};
次の用語で説明できますか:
?
コンストラクターについて話すときのデフォルトおよび暗黙的な用語には、次の意味があります。
デフォルト コンストラクターは、引数なしで呼び出すことができるコンストラクターです。引数をとらないか、引数ごとにデフォルト値を設定します。
暗黙のコンストラクターは、言語の 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;
これはコピー初期化と呼ばれ、変換の結果からの暗黙の*変換と from3
のTest
コピー構築の合成に相当しt3
ます。これはTest(int)
、変換にコンストラクターを使用し、次に暗黙的に定義された(および宣言された) コピー コンストラクターを使用します。注: コンパイラはコピーを最適化して削除できますが、コピー コンストラクターが使用可能 (アクセス指定子) であり、定義できることを確認する必要があります。
Test t4(4);
Test(int)
この場合、デフォルトのコンストラクターとして機能していないコンストラクターを使用します。
Test t5 = Test(5);
ケースと同等ですが、このケースでは からへTest t3 = 3
の変換が明示的であるという唯一の違いがあります。この例では問題になりませんが、コンストラクターがこの行としてマークされていた場合、ケースが失敗する間にコンパイルされます。5
Test
explicit
t3
*) Implicit のさらに別の使用法。この場合、 からへの変換がコードで明示的に要求されていないという事実を指します。これを、プログラマーによって明示的に変換が要求された場所と比較してください。3
Test
t5
Test(5)
一部の用語を混同しているようです。デフォルトのコンストラクターは、パラメーターをとらないコンストラクターです。コンストラクターを直接呼び出すと、暗黙的な呼び出しになります。
ともかく:
1) t1 をテストします。
デフォルトのコンストラクタ。
2) t2() をテストします。
関数宣言。
3) t3 = 3 をテストします。
コピーの初期化。変換コンストラクターを呼び出し、一時的なTest
fromを作成3
し、コピー コンストラクターを使用して を作成しますt3
。
4) t4(4) をテストします。
直接初期化。変換コンストラクターを直接使用します。
5) テスト t5 = テスト (5);
コピーの初期化。3) と同様。