2012-09-26 183 views
0

這是一位教授吹噓的同學的正確代碼,我無法理解爲什麼它需要一個雙重構造函數,我原本只有第一個函數,並且無法弄清楚它需要兩個滯後於我的作爲一個專業的C++ 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

那麼,這只是越野車。從'int'初始化不會初始化'stackSize'成員,沒有複製/移動構造函數,也不會有複製/移動賦值運算符,並且允許從int到Student記錄的隱式轉換。 –

+0

爲什麼stackSize未初始化?..我看到stacksize = 25可以工作嗎? –

+0

該行不在'Studentrecords :: Studentrecords(int size)'任何地方 –

回答

6

它不要求兩個構造進步,這就是類只是如何定義的。這樣,你可以通過兩種方式創建一個對象:

Studentrecords s(15); 

這將創建一個大小爲15的Studentrecords對象,或

Studentrecords s; 

這將調用默認的構造函數,創建類型的對象Studentrecords和大小25

我必須指出,這是不好的代碼,但:

  • 構造函數的默認Studentrecords()可以替換爲Studentrecords(int size = 25)以避免代碼重複。
  • 沒有用初始化的列出
  • 你的類,這意味着你需要一個拷貝構造函數和拷貝賦值運算符
  • 最後,您使用的是C風格的數組,而不是一個內存管理std::vector
+0

@MooingDuck正在編輯它。 –

+0

也可能提到一個構造函數從不初始化'stackSize'? –

4

第二個構造函數允許您將StudentRecords初始化爲給定的大小。這很方便,但不是絕對必要的。不幸的是,也允許從int到StudentRecords的隱式轉換,您可以通過將其設置爲explicit來禁用它。

explicit Studentrecords(int size); 

這將防止廢話如

StudentRecords s = 4*5; 

一個更重要的事實是,與動態分配的資源類交易,所以你必須遵循rule of three,並提供一個拷貝構造函數和拷貝賦值運算符,除了你已經提供的析構函數。

+0

爲什麼有人會做4 * 5? –

+0

@DavidSalazar應該顯示代碼錯誤,除非您明確聲明構造函數,否則它將編譯並執行某些操作。 – juanchopanza

0

該代碼不需要兩個構造函數。具有默認參數的單個構造函數更好。第一個構造函數被破壞,因爲它不能設置stackSize

相關問題