是否可以使用类的析构函数内部函数来重置值?
Is it ok to use the destructor inside function of a class to reset values?
在我的讲座中,我没有看到有人使用析构函数将值重置为起始参数,而是在函数中手动执行每个变量。在类函数中使用析构函数进行重置/删除会导致任何问题吗
我的意思的小例子:
class Test1{
private:
int *test;
bool valid;
public:
Test1(int value,bool valid=false){
test=new int(value); this->valid=valid;
}
~Test1(){
delete test; test=nullptr; valid=false;
}
void ResetStats(int NewValue){
this->~Test1();
test1=new int(NewValue);
valid=false;
}
}
调用非平凡析构函数会显式结束对象的生存期(为什么?
通过将功能放在单独的私有函数中,在ResetStats
和析构函数之间共享功能:
// Both destructor and ResetStats call Reset
~Test1(){
Reset(nullptr);
}
void ResetStats(int NewValue) {
Reset(new int(NewValue));
}
// Shared functionality goes here
private Reset(int *ptr) {
delete test;
test=ptr;
valid=false;
}
No.析构函数是在销毁对象时调用的,而不是在尝试重置其状态时调用的。
为了重置值,我更喜欢与默认构造对象交换,使用默认构造对象复制/移动构造,或将赋值移动到默认构造对象。
Test1 test;
// Do stuff
test.swap(Test());
当然,必须实现交换方法、复制构造函数或赋值。查找移动语义以正确实现这些内容。
考虑强制实施 RAII 的类。在我们的示例中,test 在其构造函数中获取文件句柄。如果调用解构函数是为了重置值,则当您尝试重置对象时,该对象不再具有文件句柄,因为它是在构造函数中获取并在解构函数中释放的。
解构函数应该只在对象被销毁时调用,imo。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- new[] / delete[] 并在C++中抛出构造函数/析构函数
- 创建/向容器添加对象时如何使用构造函数/析构函数
- LNK2019构造函数/析构函数使用 C++ Dll
- 在执行std::函数析构函数时调用它
- 有人可以解释一下这里发生了什么(类和构造函数/析构函数)吗?
- 带智能ptr的Pimpl-为什么需要构造函数/析构函数
- 具有纯虚函数析构函数的多态C++
- 需要构造函数/析构函数/类型转换错误
- Boost共享指针构造函数/析构函数
- std::函数析构函数中的Segfault
- 通过值或引用调用时未调用构造函数/析构函数.不管怎样
- C++构造函数析构函数中的奇怪行为
- 构造函数/析构函数链接错误
- 在模板化函数中调用具有特征的显式构造函数/析构函数
- c++构造函数/析构函数
- 为什么赋值的成本不能保证小于构造函数-析构函数对
- 重写默认构造函数/析构函数而不实现它们
- 如何检查构造函数/析构函数内部是否使用了虚方法?
- 析构函数内部的析构函数