0

これは、教授が自慢した同級生からの正しいコードであり、なぜ二重コンストラクターが必要なのか理解できません。もともと最初の関数しかなく、プロとしての私の進歩に遅れをとっていた2つが必要であることを理解できませんでした

class Studentrecords
{
private:

    struct student
    {
        string name;
        string address;
        int ID;
        double gpa;
    };

    student *stackArray;
    int stackSize;
    int top;

public:
    Studentrecords();
    Studentrecords(int size);
    ~Studentrecords();
    void push(string name, string address, int id, double gpa);
    void pop();
    bool isFull() const;
    bool isEmpty() const;
    void display();
};

Studentrecords::Studentrecords(int size)
{
    stackArray = new student[size];
    top = 0;
}

Studentrecords::Studentrecords()
{
    stackSize = 25;
    stackArray = new student[stackSize];
    top = 0;
}

Studentrecords::~Studentrecords()
{
    delete [] stackArray;
}
4

3 に答える 3

7

2 つのコンストラクターは必要ありません。それがクラスの定義方法です。このようにして、次の 2 つの方法でオブジェクトを作成できます。

Studentrecords s(15);

Studentrecordsサイズ15のオブジェクトを作成する、または

Studentrecords s;

デフォルトのコンストラクターを呼び出し、型Studentrecordsとサイズが 25 のオブジェクトを作成します。

ただし、これは悪いコードであることに注意する必要があります。

  • コードの重複を避けるために、デフォルトのStudentrecords()コンストラクターを に置き換えることができます。Studentrecords(int size = 25)
  • 初期化子リストを使用しない
  • クラスでメモリを管理しているため、コピー コンストラクターとコピー代入演算子が必要になります。
  • 最後に、. の代わりに C スタイルの配列を使用していますstd::vector
于 2012-09-26T18:24:42.067 に答える
4

StudentRecords2 番目のコンストラクターを使用すると、a を特定のサイズに初期化できます。これは便利ですが、厳密には必要ありません。残念ながら、 int から への暗黙的な変換も許可StudentRecordsされます。これは、 にすることで無効にできますexplicit

explicit Studentrecords(int size);

などのナンセンスを防ぎます。

StudentRecords s = 4*5;

さらに重要な事実は、クラスが動的に割り当てられたリソースを処理することです。そのため、3 つのルールに従い、既に提供したデストラクタに加えて、コピー コンストラクタとコピー代入演算子を提供する必要があります。

于 2012-09-26T18:24:55.483 に答える
0

コードには 2 つのコンストラクターは必要ありません。デフォルトの引数を持つ単一のコンストラクターの方が優れています。そして、最初のコンストラクターは、設定に失敗したため壊れていますstackSize

于 2012-09-26T18:26:43.297 に答える