gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:22:57 24 4
gpt4 key购买 nike

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

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

这是我的代码:

学生

 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_ptrstd::shared_ptr:永远不必手动编写 delete,并且经常可以使用 std::make_uniquestd::make_shared代替 new

关于c++ - 如果我还使用复制构造函数和重载=运算符,是否需要析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59267411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com