C++ 语言中,可以为同一个类定义多个析构函数。
C++类:构造函数(对象创建时调用)、析构函数(对象销毁时调用)、虚函数(实现多态)。构造函数不能为虚。
构造函数不能是虚函数(虚表在构造函数完成后才建立)。析构函数可以且通常应该为虚函数(防止内存泄漏)。
【考点】C++析构函数唯一性|构造函数重载机制|类成员函数定义规则
GESP八级C++模块,命题人专卡C++初学者对“重载”概念的机械迁移。他们误以为“构造函数能重载,析构函数当然也能”,却忽略析构函数的特殊语义——它是类成员函数,但参数表必须为空,且编译器在对象销毁时只会寻找匹配该类的析构函数,定义两个同名函数,编译器会报错“重定义”。
看到“多个析构函数”,第一反应是“构造函数重载”,第二步立刻刹车——析构函数是成员函数,但它是“类终结者”,编译器在对象销毁时只会寻找匹配该类的析构函数,参数为空且无重载。定义两个同名函数,编译器会报错“重定义”。
选A的考生掉进“参数重载”陷阱,误把“不同参数”当回事——但析构函数参数表必须为空,任何参数都让它不再是析构函数,而是普通成员函数,根本不会被调用。选B是正解,但题目故意用“定义”二字诱导你思考“能不能定义两个”,实则考察你是否记住“只能有一个”。
若改成“一个类能否定义多个有参析构函数”,答案仍是B,因为“有参”就不是析构函数;若改成“一个类能否定义多个同名析构函数但不同签名”,编译器会直接拒收。刷到此类题,先问“这个函数能重载吗?”——不能,就是唯一。