首页 文章

关于析构函数,复制构造函数和赋值运算符的C练习考试

提问于
浏览
-3

这是我明天在CS下级课程中考试的练习考试的问题 . 不幸的是,练习考试没有完全正确的解决方案;该问题中显示的具体问题已经获得了a),b)和c)部分中每个部分的半信用 .

问题是为什么他们只得到半信用;如果您可以对问题的一个或所有部分发布完整的解决方案,那将是非常有 Value 的 .

问题如下:


考虑一个代表建筑 Worker 的相当普通的类的摘录 .

class Worker
{
  public:
    Worker(string nm, string s)
        : m_name(nm), m_skill(s)
    {}
    string name() const { return m_name; }
    string skill() const { return m_skill; }
  private:
    string m_name;
    string m_skill;
};

因为我们没有为Worker类声明析构函数,复制构造函数或赋值运算符,所以编译器会为我们编写这些函数 .

施 Worker 员是 Worker 的集合 . 我们选择将工作人员表示为动态分配给 Worker 的指针数组 . 这是一段摘录:

class Crew
{
  public:
    Crew(int lim)
        : m_size(0), m_maxCrewSize(lim)
    {
        m_crew = new Worker*[lim];
    }

    void hire(string nm, string s)
    {
        if (m_size < m_maxCrewSize)
        {
            m_crew[m_size] = new Worker(nm, s);
            m_size++;
        }
    }
    // other functions not shown
  private:
    Worker** m_crew;
    int m_size;
    int m_maxCrewSize;
};

m_crew数组的第一个m_size元素包含指向动态分配的worker的指针;其余的元素没有特别的 Value .

Crew类的用户需要复制Crew对象并将一个Crew对象分配给另一个 .

对于下面的部分a,b和c,您可以根据需要实现其他Crew类辅助函数 . 不对Worker类进行任何更改或添加 .

一个 .

完成Crew类的析构函数的实现:

Crew::~Crew()
{
  for (int i=0; i<m_size; i++) {
    delete m_crew[i];
  }
}

湾实现Crew类的复制构造函数 .

Crew::Crew(const Crew& original)
    : m_size(original.m_size), m_maxCrewSize(original.m_maxCrewSize)
{
  m_crew = new Worker*[m_maxCrewSize];
  for (int i=0; i < m_size; i++) {
    m_crew[i] = original.m_crew[i];
  } 
}

C . 实现Crew类的赋值运算符 .

Crew& Crew::operator=(const Crew& other) {
  if (this != &other) {
    Crew temp(*this);
    m_crew = other.m_crew;
    m_size = other.m_size;
    m_maxCrewSize = other.m_maxCrewSize;
    other.m_crew = temp.m_crew;
    other.m_maxCrewSize = temp.m_maxCrewSize;
    other.m_size = temp.m_size;
  }
  return this;
}

2 回答

  • 1
    • 析构函数不释放指针数组,这意味着它会泄漏 .

    • 复制构造函数不执行深层复制(可能是预期的)

    • 赋值运算符不仅将 other 中的值分配给 this ,还将 this 中的值分配给 other . 's completely unexpected for an assignment operator, and it won'甚至编译,因为 otherconst .

  • 1

    虽然@quetzalcoatl是正确的,你应该问谁标记问题为什么他们这样标记,这里有一些提示:

    一个 . 此答案无法删除 m_crew 数组 . 结果,内存将泄漏 .

    湾在这个答案中, Worker 自己不会被复制 . 由于双 delete ,当新副本或原始 Crew 对象的析构函数运行时,程序将崩溃 .

    C . 这个答案是完全错误的 . 我不知道为什么有人会给它半分;我'd have given none. First off, you can' t写到 other 因为它是 const . 其次,您不应该写入 other ,因为赋值运算符用于赋值,而不是交换 . 第三,你不能像这样分配 m_crew 因为它会因为双 delete 而导致崩溃 .

相关问题