2012-09-26 97 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