在面试中,我要求编写构造函数、复制构造函数和赋值运算符
Posted
技术标签:
【中文标题】在面试中,我要求编写构造函数、复制构造函数和赋值运算符【英文标题】:In Interview, I asked to write constructor, Copy constructor and assignment operator 【发布时间】: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
;有了这个,所有默认的复制/移动构造函数/赋值和析构函数已经完全没问题了......
【参考方案1】:
使用裸拥有指针而不是智能指针或容器。以下代码有什么问题
*name = pointer
格式不正确。
new char[]
格式不正确。
【讨论】:
以上是关于在面试中,我要求编写构造函数、复制构造函数和赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章