在面试中,我要求写构造函数、复制构造函数和赋值运算符

In Interview, I asked to write constructor, Copy constructor and assignment operator

提问人:Sachin Palande 提问时间:11/25/2021 更新时间:11/25/2021 访问量:125

问:

在面试中,我要求写构造函数、复制构造函数和赋值运算符。我写了以下代码。

然后他问我,按照我无法回答的代码有什么问题,你能帮我知道哪里出了问题吗?

另外,从问题中,面试官试图找到什么?

//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
}
C++ 复制构造函数 赋值运算符

评论

0赞 273K 11/25/2021
复制构造函数仅复制一个字符并取消引用未初始化的指针。操作员尝试仅将一个字符复制到已删除的内存中。运算符的声明不允许像 这样的顺序赋值。默认构造函数编译失败。a = b = c;
0赞 Aconcagua 11/25/2021
new char[]也是无效的 - 要么你只需要一个字符( 或 ),但随后你需要 - 或者你需要指定一个数组大小(因为你似乎总是只使用一个字符) - 第一次尝试,稍后你可能想要更长的数组......new char;new char()delete namenew char[1]
0赞 Aconcagua 11/25/2021
赋值不应该:你只是复制一个字符,但如果之前删除了数组,你会把它复制到哪里?(注意:稍后您将删除,但不会像现在这样,只是复制单个字符)。delete[]
0赞 Aconcagua 11/25/2021
小问题:您应该使用构造函数的初始化器列表(不要与以下版本混淆):类似的复制构造函数,但您仍然需要分配单个字符 - 这有利于直接初始化而不是默认初始化 + 赋值,如果涉及复杂类,后者可能会产生大量开销。还要注意,某些类型只能以这种方式初始化(引用、成员、非默认构造类型)。std::initializer_listEmployee() : id(0), name(new char[1]) {}const
0赞 Aconcagua 11/25/2021
还要注意,使用是出于学习目的,以后你很可能会改用;有了这个,所有默认的复制/移动构造函数/赋值和析构函数都已经完全没问题了......char*std::string

答:

0赞 eerorika 11/25/2021 #1

以下代码有什么问题

  • 使用裸露的自有指针,而不是智能指针或容器。
  • *name = pointer格式不正确。
  • new char[]格式不正确。