提问人:Jay 提问时间:7/16/2014 最后编辑:quetzalcoatlJay 更新时间:7/16/2014 访问量:857
关于析构函数、复制构造函数和赋值运算符的 C++ 练习考试
C++ practice exam on Destructors, Copy Constructors, and Assignment Operators
问:
这是我明天在 CS 低年级课程的期中模拟考试中的一个问题。不幸的是,模拟考试没有完全正确的解决方案;发布的问题中显示的具体问题在 a)、b) 和 c) 部分各获得了一半的学分。
问题是为什么他们只获得了一半的学分;如果你能为问题的一个或所有部分发布一个完整的解决方案,那将是巨大的价值。
问题如下:
考虑一下这个摘录,摘自一个代表建筑工人的相当普通的班级。
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 类声明析构函数、复制构造函数或赋值运算符,因此编译器会为我们编写这些函数。
施工人员是工人的集合。我们选择将 crew 表示为动态分配的指向 Workers 的指针数组。摘录如下:
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 个元素包含指向动态分配的辅助角色的指针;其余元素没有特定值。
Crew 类的用户将需要复制 Crew 对象并将一个 Crew 对象分配给另一个对象。
对于下面的 a、b 和 c 部分,如果您愿意,可以实现其他 Crew 类帮助程序函数。不对 Worker 类进行任何更改或添加。
一个。
完成 Crew 类的析构函数的实现:
Crew::~Crew()
{
for (int i=0; i<m_size; i++) {
delete m_crew[i];
}
}
b.实现 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;
}
答:
- 析构函数不会释放指针数组,这意味着它会泄漏。
- 复制构造函数不执行深层复制(这可能是预期的)
- 赋值运算符不仅赋值 to ,还赋值 from to 。对于赋值运算符来说,这是完全出乎意料的,它甚至不会编译,因为 是 .
other
this
this
other
other
const
评论
虽然@quetzalcoatl您应该询问标记问题的人为什么这样标记问题,这是正确的,但这里有一些提示:
一个。此答案无法删除数组。结果,内存会泄漏。m_crew
b.在这个答案中,工人本身没有被复制。当新副本或原始对象的析构函数运行时,程序将崩溃,因为双精度 .Crew
delete
c. 这个答案是完全错误的。我不知道为什么有人会给它半分;我什么都不会给。首先,你不能写信,因为它是 .其次,您不应该写信,因为赋值运算符是用于赋值的,而不是交换的。第三,你不能就这样分配,因为它会导致以后因为双精度而崩溃。other
const
other
m_crew
delete
评论
std::vector
Worker
new Worker(original.m_crew[i])
评论
The question is why they received only half-credit
- 好吧,问问监督考试和分配分数的人。这就是答案的完美来源。我知道这是无益的,而且是显而易见的,但实际上,没有主管的观点,这主要是猜测(当然,除了一些明显的错误,如果有的话,我没有分析代码 - 我只是对原始问题做出反应)。delete
m_crew = new Worker*[lim];
operator=
Crew temp(*this)
Worker**
int
operator=
other...
operaotr=
this->m_crew = other.m_crew