タグ付けされた質問 「default-constructor」

3
「= default」はデフォルトのコンストラクタとデストラクタの「{}」とどう違うのですか?
もともとはデストラクタについての質問としてこれを投稿しましたが、今はデフォルトのコンストラクタの考慮を追加しています。元の質問は次のとおりです。 クラスに仮想のデストラクタを与えたいが、それ以外はコンパイラが生成するものと同じである場合は、次のように使用できます=default。 class Widget { public: virtual ~Widget() = default; }; しかし、空の定義を使用して入力を減らすことで同じ効果を得ることができるようです: class Widget { public: virtual ~Widget() {} }; これらの2つの定義が異なる動作をする方法はありますか? この質問に投稿された回答に基づくと、デフォルトのコンストラクタの状況は似ているようです。デストラクタの「=default」と「{}」の意味にほとんど違いがないことを考えると、デフォルトのコンストラクタのこれらのオプションの意味にも同様にほとんど違いはありませんか?つまり、そのタイプのオブジェクトが作成されて破壊されるタイプを作成したいと仮定すると、なぜ私は言いたいのですか? Widget() = default; の代わりに Widget() {} ? 元の投稿後にこの質問を拡張すると、SOのルールに違反することになります。デフォルトのコンストラクタについてほぼ同じ質問を投稿することは、あまり望ましくない選択肢であると私を思いました。

11
パラメーター付きのコンストラクターを作成すると、デフォルトのパラメーターレスコンストラクターがなくなる理由
C#、C ++、およびJavaでは、パラメーターを受け取るコンストラクターを作成すると、パラメーターのないデフォルトのコンストラクターがなくなります。私は常にこの事実を受け入れてきましたが、今はなぜなのかと思い始めています。 この動作の理由は何ですか?「独自のコンストラクターを作成した場合、おそらくこの暗黙的なコンストラクターをぶら下げたくない」と言っているだけの「安全対策/推測」ですか?それとも、自分でコンストラクタを作成した後にコンパイラが追加できないようにする技術的な理由がありますか?

11
JPAを使用するKotlin:デフォルトのコンストラクター地獄
JPAが必要とするように、@Entityクラスは、データベースからオブジェクトを取得するときにオブジェクトをインスタンス化するデフォルト(非引数)コンストラクターを持つ必要があります。 Kotlinでは、プロパティは次の例のように、プライマリコンストラクタ内で宣言するのに非常に便利です。 class Person(val name: String, val age: Int) { /* ... */ } ただし、非引数コンストラクターがセカンダリコンストラクターとして宣言されている場合、プライマリコンストラクターの値を渡す必要があるため、次のように、それらに有効な値が必要です。 @Entity class Person(val name: String, val age: Int) { private constructor(): this("", 0) } プロパティが単なるより複雑なタイプでStringありInt、null可能ではない場合、特にプライマリコンストラクターとinitブロックに多くのコードがあり、パラメーターがアクティブに使用されている場合、それらの値を提供することは完全に悪いように見えます- -それらがリフレクションによって再割り当てされる場合、ほとんどのコードが再度実行されます。 さらに、valコンストラクターの実行後に-propertiesを再割り当てできないため、不変性も失われます。 したがって、問題は、コードを重複させずに「マジック」初期値と不変性の損失を選択して、JPAで動作するようにKotlinコードをどのように適合させることができるかということです。 PS JPA以外のHibernateがデフォルトのコンストラクターなしでオブジェクトを構築できるのは本当ですか?

3
デフォルト/コピー/移動トラクターおよびコピー/移動割り当て演算子の自動生成の条件?
通常、コンパイラーがデフォルトのコンストラクター、コピーコンストラクター、および代入演算子を自動生成する条件で、メモリを更新します。 いくつかのルールがあったことを思い出しますが、覚えていません。また、信頼できるリソースをオンラインで見つけることもできません。誰か助けてもらえますか?

4
std :: arrayのデフォルトの初期化?
C ++ 11 std::arrayでは、構文std::array<T, N> x;が配列のすべての要素をデフォルトで初期化することが保証されますか? 編集:そうでない場合、すべての要素をデフォルト値に初期化するためにすべての配列(サイズがゼロの配列を含む)で機能する構文はありますか? 編集:cppreferenceで、デフォルトのコンストラクタの説明は次のように述べています: (constructor) (implicitly declared) (public member function) default-constructs or copy-constructs every element of the array そう答えはイエスかもしれません。しかし、私はそれを標準または将来の標準に従って確認したいと思います。

4
リフレクションを使用してC#でデフォルトコンストラクターなしの型のインスタンスを作成する
例として次のクラスを取り上げます。 class Sometype { int someValue; public Sometype(int someValue) { this.someValue = someValue; } } 次に、リフレクションを使用してこのタイプのインスタンスを作成します。 Type t = typeof(Sometype); object o = Activator.CreateInstance(t); 通常、これは機能SomeTypeしますが、パラメーターなしのコンストラクターが定義されていないため、への呼び出しにより、「このオブジェクトにパラメーターなしのコンストラクターが定義されていません。」というメッセージが表示されActivator.CreateInstance、タイプの例外がスローされます。すべてのクラスにパラメーターなしのコンストラクターを追加するのはちょっと厄介です。MissingMethodException

3
プライベートコンストラクターがプライベートコンストラクターではないのはいつですか?
タイプがあり、そのデフォルトのコンストラクタをプライベートにしたいとします。私は次のように書きます: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // …

1
operator new()は、デフォルトのコンストラクターの存在に応じて、delete()が削除された場合の動作が異なります。
演算子new()を使用してクラスCの新しいオブジェクトを作成すると、ここでエラーが発生します。 class C { public: C() {} virtual ~C() {} void operator delete(void*) = delete; }; int main() { C* c = new C; } と C2280: 'void C::operator delete(void *)': function was explicitly deleted 私は交換するときでもC() {} とC() = default; か、そのコンパイラが(私はと同じ効果を持つと信じデフォルトコンストラクタを挿入するように、行を削除= default)、コードはコンパイルして実行します。 コンパイラが生成したデフォルトのコンストラクタとユーザー定義のデフォルトのコンストラクタの違いは何ですか? 私はこの投稿でいくつかのヒントを得ましたが、デストラクタが仮想なので、ここのクラスC(ユーザー提供のコンストラクタなし)は簡単ではありませんよね? 最新のVisual Studio、c ++ 17でコンパイルされています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.