0

私の研究では、ユーザーがクラスのデフォルト コンストラクターを呼び出せないようにしたい場合は、それを非公開にできることを学びました。

class Person
{
public:
  Person(const Person&);
  ~Person();
private:
  Person();  //Any call to this will cause a compiler error.
};

私が理解していないのは、クラスの初期化されていない配列を作成すると、それがプライベートであるという構文エラーが表示されることです:

Person * ptr;   //Works just fine.
Person arr[1];  //Syntax error: 'Person::Person()' is private

これにより、配列の作成時にデフォルトのコンストラクターを呼び出そうとしていると思われます。しかし、実際には実際のオブジェクトを作成していないので、これは私には意味がありません。

4

5 に答える 5

8

初期化されていない配列を作成していません。オブジェクトの配列を作成していPersonます。そして、何らかの方法で初期化する必要があります。コンストラクターが存在しない場合は、デフォルトの初期化規則にフォールバックします (一部のメンバーに未指定の値が残る可能性があります)。ただし、コンストラクターが宣言されている場合は、それを使用する必要があります。

C++ には「初期化されていない」オブジェクトなどというものはありません。オブジェクトは構築されたときに存在し、構築中に、オブジェクトの外観に応じて何らかの方法で初期化されます。

于 2012-06-15T09:48:45.280 に答える
4
Person * ptr;   //Works just fine. 
Person arr[1];  //Syntax error: 'Person::Person()' is private 

これにより、配列の作成時にデフォルトのコンストラクターを呼び出そうとしていると思われます。しかし、実際には実際のオブジェクトを作成していないので、これは私には意味がありません。

これがあなたの間違いです。2 番目の例 (失敗した例) では、実際のオブジェクトを作成しています。1 つの要素/オブジェクトを持つ人物 (人?!) の配列を定義しています。

したがって、その配列に入るオブジェクトを作成しています。

オブジェクトがいつ作成されるか覚えておいてください - 何が起こるでしょうか? 適切な定義済みコンストラクターがない場合、コンストラクターが呼び出されます。コンパイラーは何をしますか?

デフォルトのものを使用しますが、プライベートであるため使用できません。

于 2012-06-15T09:55:53.340 に答える
1
Person * ptr; is a pointer and it is not initialized
Person arr[1]; is an array of Person and for each element it is called Person()
as a default constructor

Person() を上書きするため、コンパイラは Person() コンストラクターを取得します。これはプライベートであるため、クラスの外部からプライベート メソッドを呼び出すことができないため、エラーが発生します。

于 2012-06-15T09:57:37.113 に答える
1
Person * ptr;

これは Person オブジェクトを作成しません。初期化されていない値を持つ単なるポインターです。

于 2012-06-15T09:52:47.773 に答える
0

2行に違いがあります

Person * ptr;   //Works just fine.
Person arr[1]; 

最初の行では、ポインタを宣言しましたが、メモリを割り当てていません。したがって、コンストラクターはまだ呼び出されていません。したがって、エラーは発生しません。

より明確にしたい場合は、これを試してください

ptr = new Person();

2 行目では、コストラクタを呼び出すクラス オブジェクトの配列をインスタンス化しています。したがって、エラーが発生しています

于 2012-06-15T09:51:54.400 に答える