【发布时间】:2022-01-03 10:49:26
【问题描述】:
在面试中,我要求编写构造函数、复制构造函数和赋值运算符。我写了以下代码。
然后他问我下面的代码有什么问题,我无法回答,你能帮我知道什么问题吗?
另外,面试官想找到什么问题?
//constructor, copy constructor, assignment operator and destructor
class Employee
{
int id;
char *name;
public:
//constructor
Employee()
{
id=0;
*name = new char[];
}
//Copy constructor
Employee (const Employee& oldObj)
{
id = oldObj.id;
*name = *(oldObj.name);
}
//destructor
~Employee()
{
delete[] name;
}
//Assignment operator overloading
void operator = (const Employee& obj)
{
id = obj.id;
delete[] name;
*name = *(obj.name);
}
};
int main()
{
Employee a1;
Employee a2 = a1; //copy constructor
Employee a3;
a3 = a1;//assignment operator
}
【问题讨论】:
-
复制构造函数只复制一个字符并取消引用未初始化的指针。操作员尝试仅将一个字符复制到已删除的内存中。运算符的声明不允许像
a = b = c;这样的顺序赋值。默认构造函数编译失败。 -
new char[]也是无效的——要么你只需要一个字符(new char;或new char()),但你需要delete name——或者你需要指定一个数组大小(因为你似乎总是只使用一个字符然后new char[1]) - 第一次尝试,稍后你可能想要更长的数组...... -
赋值不应该
delete[]:你只是在复制一个字符,但是如果之前删除了数组,你会把它复制到哪里呢? (注意:稍后你将删除,但不是现在,只是复制单个字符。 -
次要问题:您应该使用构造函数的初始化列表(不要与
std::initializer_list混淆):Employee() : id(0), name(new char[1]) {}类似的复制构造函数,但您仍然需要分配单个字符——这有利于直接初始化优于默认初始化+分配,如果涉及复杂的类,后者可能会有很大的开销。还要注意,某些类型 only 可以这样初始化(引用、const成员、非默认可构造类型)。 -
请注意,使用
char*是出于学习 的目的,稍后您很可能会改用std::string;有了这个,所有默认的复制/移动构造函数/赋值和析构函数已经完全没问题了......
标签: c++ copy-constructor assignment-operator