析构函数能否在const对象上调用非const成员函数?
析构函数能否调用非const的
do_this()? 当然可以!析构函数完全能够安全调用do_this(),刚好能满足你提到的所有场景需求,下面给你理清楚原因和注意事项:
析构阶段的对象不处于const状态:哪怕你的对象原本是
const类型,当析构函数执行时,对象的const属性会被自动解除。因为销毁过程本身允许修改对象的成员(毕竟对象马上就要被回收了),所以do_this()因为修改成员变量无法声明为const的问题,在析构调用时完全不存在障碍。完美适配你的代码复用需求:你不想把
do_this()的逻辑硬塞进析构函数,同时又需要在析构外也能调用这个方法——这种将通用逻辑封装到独立函数、析构仅做调用的写法,本身就是很合理的代码组织方式,既避免了代码重复,又保持了逻辑的清晰性。
给你一个简单的代码示例参考:
class Foo { private: int internal_state; public: // 非const方法,负责修改成员变量的逻辑 void do_this() { internal_state = 0; // 其他需要修改成员的操作 } // 析构函数中调用do_this() ~Foo() { do_this(); } }; // 测试const对象的情况 int main() { const Foo const_foo; // 当const_foo离开作用域被销毁时,析构函数会正常调用do_this(),无编译错误 return 0; }
不过有个小提醒:调用时要确保do_this()里的逻辑在析构阶段是安全的——比如不要访问已经被提前销毁的成员(比如如果你的类有成员是其他对象,可能已经先于当前对象析构了),也不要调用那些依赖对象完整状态的函数,毕竟此时对象正在被清理。
内容的提问来源于stack exchange,提问作者Mike Borkland
相关产品推荐
相关产品推荐

