0

SomeClass * initialEl = new SomeClass [5]; SomeClassに非公開で宣言されたデフォルトコンストラクタがないと仮定すると、必然的にコンパイルされますか?検討:

/*
 * SomeClass.h
 *
 */

#ifndef SOMECLASS_H_
#define SOMECLASS_H_

class SomeClass
{

public:
    SomeClass(int){}
    ~SomeClass(){}
};

#endif /* SOMECLASS_H_ */


/*
 * main.cpp
 *
 */

#include "SomeClass.h"

int main()
{
    SomeClass* initialEl = new SomeClass[5];

    delete[] initialEl;

    return 0;
}
4

2 に答える 2

5

SomeClassはい、公的にアクセス可能なデフォルトコンストラクターがあると仮定します。

には違いがあることに注意してください

  1. 公的にアクセス可能なデフォルトコンストラクター(私が言ったこと)と
  2. 非公開で宣言されたデフォルトコンストラクターがない(あなたが言ったこと)

次のクラスの場合、2。は真ですが、1はそうではありません。

class A {
    SomeClass(const SomeClass&) {}
};

これは§12.1/5(C ++ 03)によるものです。

クラスXのユーザー宣言コンストラクターがない場合、デフォルトのコンストラクターが暗黙的に宣言されます。暗黙的に宣言されたデフォルトコンストラクターは、inline publicそのクラスのメンバーです。


アップデートでSomeClassは、デフォルトのコンストラクターはありません。1つを宣言していません。また、別のコンストラクターを宣言しているため、コンパイラーも暗黙的に宣言しません。

必要な場合は、自分で実装する必要があります。

class A {
public:
    SomeClass(int) {}
    SomeClass() {}
};

または、別のコンストラクターをデフォルトのコンストラクターとして認定します。

class A {
public:
    SomeClass(int=0) {}
};
于 2010-07-15T17:38:49.637 に答える
1

いいえ、デフォルトのコンストラクターがないとコンパイルされません。この場合、別のコンストラクターを定義しているため、コンパイラーによって生成されたデフォルトのコンストラクターはありません。「コンパイラーは、必要に応じて、ユーザーが他のコンストラクターを宣言していない場合に、コンストラクターを生成しようとします。」--C ++プログラミング言語、Stroustrup

本当に使用したい場合はnew SomeClass[5]、デフォルトのコンストラクターも提供する必要があります。

于 2010-07-15T18:11:10.930 に答える