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

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[] 格式不正确。

【讨论】:

以上是关于在面试中,我要求编写构造函数、复制构造函数和赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章

php构造方法(函数)基础

复制构造函数 与 赋值函数 的区别(转)

C++初阶第五篇——类和对象(中)(构造函数+析构函数+拷贝构造函数+赋值操作符重载)

c++中拷贝构造函数和赋值运算符重载本质上一样么

复制构造函数与赋值运算符(=)有何不同

赋值复制构造函数和构造函数 & 异常安全的赋值