如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

菲菲

因此,在我的代码中,我有类Student,该类的矢量是* ModuleGrade类的对象。我在Student类中有一个析构函数,但随后在=运算符的重载中也有一个析构函数。我是否需要两次都使用它,还是可以将析构函数保留在Student类中,所以它在=运算符的重载中也可以完成此工作。我希望我能解释一下。

编辑:我知道一个事实,如果向量不带*会更好,但是这样做的目的是让我证明我了解*​​和深层复制构造函数是如何工作的。

这是我的代码:

学生

 private:
    int studentNumber;
    vector <ModuleGrade*> gradeList;
 public:
    ~Student();
    Student(const Student& student);  // user-defined copy ctor
    Student& operator = (const Student& student);

学生.cpp

Student::~Student() 
{

    int number = gradeList.size();
    for(int i= 0; i<number; i++){
        delete gradeList[i];
    }
} 


Student::Student(const Student &student ) : Person(student) {
    //deep copy constructor
    this->studentNumber=student.studentNumber;
    int size = student.gradeList.size();
    for(int i=0; i <size; i++) {

       // ModuleGrade *m ;
        ModuleGrade *mg = new ModuleGrade(*(student.gradeList[i]));
        gradeList.push_back(mg);
    }

}

Student& Student :: operator = (const Student & student) {
    if (&student == this) return *this;
    Person :: operator=(student);
    studentNumber = student.studentNumber;

    //delete gradeList of this
    //SHOULD I DO THIS IF THERE IS A DESTRUCTOR DECLARED???
    for (unsigned int i=0; i<gradeList.size(); i++){
        delete gradeList[i];
        gradeList.clear();
    }

    //fill this with grades of student
    for(unsigned int i=0; i<student.gradeList.size(); i++) {
        ModuleGrade *m = new ModuleGrade(*(student.gradeList[i]));
        gradeList.push_back(m);

    }

    return *this;
}
安东尼·威廉姆斯

是的,如果您管理指针,则需要确保在分配和销毁时清除指向对象。

这就是为什么人们经常使用move和swap编写赋值运算符的原因:

X& operator=(X const& other){
   X temp(other);
   swap(temp);
   return *this;
}

因为清理工作只需要写在析构函数中即可。swap只是交换内容,而复制构造函数分配新内容。

使用移动交换还可以覆盖您编写的情况,x=x否则,如果在尝试从另一个对象复制数据之前销毁了被分配给对象的数据,则需要在赋值运算符中明确测试该情况。目的。

同样,在实际代码中,您应该使用,std::unique_ptr或者std::shared_ptr如果您想通过指针来保存对象:您永远不必delete手动编写,并且经常可以使用std::make_uniquestd::make_shared代替new

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用shared_ptr时需要实现析构函数,复制构造函数,赋值运算符

是否在重载的运算符delete函数中隐式调用析构函数?

链表:如何实现析构函数、复制构造函数和复制赋值运算符?

在派生类中定义析构函数需要复制赋值运算符

类析构函数导致重载+运算符的问题

为什么虚拟析构函数需要删除运算符?

从赋值运算符调用析构函数是否有任何意外的后果?

取消运算符delete []中的析构函数调用

C ++是否为纯虚拟类创建默认的“构造函数/析构函数/复制构造函数/复制赋值运算符”?

std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

重载delete []运算符,以允许使用析构函数缩小类型的数组

为什么移动运算符不只是析构函数+移动构造函数

重载运算符new []的行为取决于析构函数

运算符重载影响我的复制构造函数

运算符重载和复制构造函数

复制构造函数和重载加法运算符

如果类具有析构函数/删除[],则成员运算符new []的参数“ size”增加

具有虚拟和非虚拟析构函数的删除运算符的不同行为

在析构函数中使用空条件运算符是一种不好的做法吗?

如何在移动分配运算符中调用析构函数?

来自libc ++的istringstream析构函数中对运算符delete的未定义引用

为什么在运算符delete中不调用析构函数?

QDialogs中是否需要析构函数?

重载 -> shared_ptr<interface> 实例中的箭头运算符,接口中没有纯虚拟析构函数

我是否需要在新类中声明构造函数和析构函数?

重载的赋值运算符函数和复制构造函数中的错误

C ++复制构造函数和=运算符中的重载情况

复制构造函数和Assignemnt运算符重载在C ++中不起作用

C ++多线程:构造函数和析构函数是否需要互斥体?