8

こので私は現在読んでいます私はこれに出くわしました:

クラスにはコンストラクターは必要ありません。オブジェクトが初期化を必要としない場合、デフォルトのコンストラクターは必要ありません。

上記から、コンパイラがクラス/構造のデフォルトコンストラクタを生成しない場合があると推測するのは正しいですか?はいの場合、それらのケースは何ですか?私は冒険して、PODはおそらく1つだと言います。他にありますか?

編集:元のタイトルは、クラスにコンストラクターがまったくない場合を尋ねるのではなく、デフォルトのコンストラクターが定義されていない場合に尋ねたという意味を与えたため、タイトルを変更しました。

4

9 に答える 9

8

クラスにはコンストラクターは必要ありません。オブジェクトが初期化を必要としない場合、既定のコンストラクターは必要ありません。

著者はこの状況について次のように語っていると思います。

some_type some_function () {
   POD_type this_is_intentionally_uninitialized;
   ...
}

状況によっては、コンストラクターが呼び出されないことがあります。コンストラクターを作成するとすぐに、POD クラスがないため、コンストラクターが呼び出されます。

ランダムで初期化されていないデータを含むオブジェクトが走り回っていることが良いことか悪いことかは、まったく別の問題です。

于 2011-08-20T15:08:52.607 に答える
5

デフォルトのコンストラクターは常に宣言されます。しかし、常に定義されているわけではありません。使用される場合にのみ、コンパイラ (またはユーザー) が定義します。例:

struct A { std::string str; };
// not yet defined

struct B : A { };
// not yet defined

B b; 
// Now B::B and A::A are defined

これには直接的な実際的な影響があることに注意してください

struct A { private: A(); };
struct B : A { };
// valid, as B::B is not yet defined

B b; 
// now invalid, because B::B is defined and tries to call a 
// private base class constructor
于 2011-08-20T13:23:33.130 に答える
3

パラメータを持つコンストラクタを使用してクラスのオブジェクトを常に作成する場合、デフォルトのコンストラクタは必要ありません。

コンパイラはすべてのクラスに対して既定のコンストラクターを生成しますが、そのクラスに対して独自のコンストラクターを定義すると、コンパイラー自体は既定のコンストラクターを生成しません。指定したコンストラクターを介してそのようなクラスのオブジェクトを作成する限り、クラスは必要なく、デフォルトのコンストラクターを持ちません。

class Myclass
{
    int m_i;
    public:
        Myclass(int i)
        {
            m_i = i;
        }

};

int main()
{
    Myclass obj1(10); // #1, uses overloaded constructor
    Myclass obj2; //#2, Will generate compiler error of no matching constructor
    return 0;
}

上記の例に関連して、本からの引用を考えてみましょう。

クラスにはコンストラクターは必要ありません。オブジェクトが初期化を必要としない場合、既定のコンストラクターは必要ありません。

上記の例では、 #1 を使用して のオブジェクトが作成されている限りMyclass、クラスはデフォルトのコンストラクターを必要とせず、持っていません。

のオブジェクトがデフォルトのコンストラクターを必要とする方法で作成された場合、クラスに対してデフォルトのコンストラクターを定義するMyclass必要があります。

于 2011-08-20T13:23:14.973 に答える
0

あなたの質問には特定のあいまいさがあります。ご覧のとおり、コンストラクターに関してコンパイラーが実行する暗黙のアクションには、コンストラクターの宣言定義の両方が含まれます。あるコンストラクターが宣言されているが定義されていない場合、それが存在すると思いますか?

とにかく、コンストラクターが宣言されていないクラスを作成する方法はありません。たとえば、コピーコンストラクタは常に宣言されます。それを抑制する方法はありません。自分で宣言しない場合は、コンパイラが宣言します。

デフォルトのコンストラクターに関しては、暗黙の宣言を抑制することができます。コンストラクターを自分で(つまり明示的に)宣言した場合、コンパイラーはデフォルトのコンストラクターを暗黙的に宣言しませ。ただし、この場合、もちろん、クラスにはコンストラクターがあります。これは、自分で宣言したコンストラクターです。(さらに、上で述べたように、コピーコンストラクターは常に宣言されます)。

暗黙的に定義されたコンストラクターについては...それらを使用する場合にのみ、コンパイラーによって定義されます。そしてもちろん、それらは可能な場合にのみ定義されます。(暗黙のコンストラクターを使用していて、定義が不可能であることが判明した場合、プログラムは単純にコンパイルされません)。

したがって、ここでも、宣言されたコンストラクターに関しては、コンストラクターがまったくないクラスを持つことはできません。すべてのクラスには、少なくとも1つのコンストラクターが宣言されています。

特にコンストラクターの定義に関心がある場合は、コンストラクターが定義されていないクラスを持つことは確かに可能です。これがあなたのための例です

struct S {
  S(const S&);
};

それでおしまい。クラスには1つのコンストラクターが宣言されていますが、定義されていません:)

于 2011-08-20T22:30:27.333 に答える
0

コンパイラーは、コンストラクターを提供していない場合にのみ、自動生成された既定のコンストラクターを宣言および定義します。

ただし、インスタンス化できない親クラスを使用すると、あらゆる種類のコンストラクターが機能しなくなる可能性があります。ダミー パラメーターを使用してダミー コンストラクターを追加することにより、自動生成された既定のコンストラクターのみを強制終了することができますが、手間がかかります。

于 2011-08-20T17:23:57.107 に答える
0

私の意見では、その文は、一部のクラスはデフォルトで初期化する必要がない場合があるため、常に独自のデフォルト コンストラクターを記述する必要がないことを意味します。

たとえば、クラスに独自のデフォルト コンストラクターを提供する複数のクラス フィールドが含まれている場合、メンバーのコンストラクターはデフォルトで呼び出されるため、デフォルト コンストラクターを記述する必要はありません。

極端に反対に、フィールドを手動で正しく初期化するためにプログラマーに依存する POD のastructまたは aを書きたい場合があります。classこの場合、デフォルトのコンストラクターを作成することはできません。したがって、コンパイラーは、これらのフィールドをデフォルトの初期化されていない値のままにする独自のコンストラクターを作成します (実際には、これはノーオペレーションであり、おそらく最適化されます)。

于 2011-08-20T13:27:06.893 に答える
-1

some_type some_function () { POD_type this_is_intentionally_uninitialized; ... }

于 2018-01-30T10:57:51.670 に答える