C++のデフォルトのコンストラクタ


時間:2014.03.08
場所:基地2階
------------------------------------------------------------------------
一、簡単に述べる
C++の既定のコンストラクション関数により、クラスのオブジェクトの生成時に基本情報を提供することなくオブジェクトを初期化できます.たとえば、数値クラスのオブジェクトは一般的に0に初期化され、ポインタクラスのオブジェクトはnullなどに初期化されます.しかし、携帯電話の電話帳フィールドのクラスなど、追加の情報がなければ初期化動作を完了できないオブジェクトもあり、外部から指定された人名を取得していないオブジェクトは意味がありません.例えば、会社が生産している機器設備には識別番号があります.この用途のために(アナログ機器装置)生成されたオブジェクトに適切なID番号が与えられていなければ意味がない.したがって、現実世界では、生成されたオブジェクトのないクラスから生成されたオブジェクトのあるクラスにデフォルト構造を含めるべきであり、オブジェクトを生成するために何らかの外来情報が必要なクラスにデフォルト構造を持つ必要はない.しかし、1つのクラスにデフォルト構造が欠けている場合に使用するにはいくつかの制限があり、これは後で詳しく議論する内容です.
------------------------------------------------------------------------
二、問題
会社の機器のために設計されたクラスを考慮すると、機器番号は各機器に必要な属性です.このクラスは次のように定義されます.
class EquipmentPiece{
public:
  EquipmentPiece(int id_number);
  ......
};
このようにEquipmentPieceにはデフォルトのコンストラクション関数がなく、問題もあります.
1つのデバイスシリーズでは、例えば配列が生成されるため、ここでは配列内のオブジェクトにID番号を指定するのは不便である.したがって、EquipmentPieceオブジェクトからなる配列を生成することはほとんど不可能です.例:
EquipmentPiece best_pieces[10];  //  ,          ,    
EquipmentPiece *best_pieces_ptr=new EquipmentPiece[10];  //  

------------------------------------------------------------------------
三、問題を解決する
1.非スタック配列を使用して、配列を定義する際に必要な引数情報を提供します.この欠点は、配列が指すすべてのオブジェクトを削除することです.そうしないと、リソースが漏洩します.2つ目は、ポインタをスペースに配置する必要があり、EquipmentPieceオブジェクトをスペースに配置する必要があるため、メモリの総量が大きくなります.
int ID1,ID2,ID3,......ID10;
...
EquipmentPiece best_pieces[]={
  EquipmentPiece(ID10,
  EquipmentPiece(ID2),
  EquipmentPiece(ID3),
  EquipmentPiece(ID4),
  ......
  EquipmentPiece(ID10)
};
欠点は、スタック配列を拡張できないことです.
2.オブジェクト配列ではなくポインタ配列を使用
typedef EquipmentPiece* FEP;  //PEP   EquipmentPiece   
PEP best_pieces[10];  //        ,    ctor
PEP *best_pieces=new PEP[10];//    
  ,              EquipmentPiece  
for(int i==0;i<10;++i)
  best_pieces[i]=new EquipmentPiece(ID Number);

------------------------------------------------------------------------
四、まとめ
無意味なデフォルトコンストラクタを追加すると、クラスの効率にも影響します.したがって、必ずしも必要でない限り、デフォルトコンストラクタは提供されません.