【问题标题】: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;有了这个,所有默认的复制/移动构造函数/赋值和析构函数已经完全没问题了......

标签: c++ copy-constructor assignment-operator


【解决方案1】:

以下代码有什么问题

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

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多