我被问到一个问题,一个班级有multiple constructors
,但为什么它只有one destructor
?
我举了下面的例子,
class abc
{
public:
int a;
abc()
{
cout << "Default\n";
}
abc(int)
{
cout << "Int\n";
}
~abc()
{
cout << "Destructor\n";
}
};
int main()
{
abc ab;
abc a(5);
}
我在abc a(5)之前解释过;被调用的析构函数将被调用,因此在特定时间点只会有一个对象。我现在在我的电脑上运行了上面的代码,但它输出为
Default
Int
Destructor
Destructor
如果是这样,为什么我们有one destructor
?
答案 0 :(得分:8)
析构函数没有参数,因此只能有一个参数。但是,您可以拥有多个构造函数,因为您可以重载构造函数,这是Destructors无法实现的。 还要添加析构函数用于终止类的实例并释放它正在使用的所有资源。 当您销毁对象时没有可选项。当析构函数被调用时,实例将不存在。
虽然是一个非常奇怪的例子来解释它,但是如果你有1个苹果和1个番石榴,那么你将使用1刀切割它。 ;)
Destructors通常用于在销毁对象时释放内存并对类对象及其类成员进行其他清理。当该对象超出范围或被明确删除时,将为类对象调用析构函数。
在abc之前(5);被调用的析构函数将被调用
不会因为隐式调用析构函数而不会调用它。
旁注: -
但是,如果您打算明确调用析构函数(大多数程序员不会建议),那么管理资源将完全是您的责任。编译器不会处理它,它可能导致严重的内存问题。您可以查看 C++ FAQ 来解释它。
答案 1 :(得分:1)
析构函数不能重载,因为它不带任何参数(也没有返回类型)。 其目的是从内存中释放类正在使用的内存中的任何对象。通常,你在这里解除分配。
问题在于析构函数将通过delete
或delete[]
关键字调用,该关键字不接受参数。他们为什么要这样?无论如何,你想破坏整个对象,而不是它的一部分。
答案 2 :(得分:1)
这个想法是可以有不同的方式来构造和初始化一个对象,因此不仅可以有一个构造函数,而且只有一种方法可以销毁对象。该语言不允许自定义对象的销毁。无论如何创建一个类型的所有对象都必须以相同的方式销毁。
答案 3 :(得分:0)
可以使用各种参数重载构造函数,但析构函数不能重载,因为它不包含参数。 这是一个主要原因。
从逻辑上讲,你将删除析构函数中的所有东西,因此实际上不需要参数来指定任何东西..
答案 4 :(得分:0)
析构函数不带参数,也没有返回类型。它的地址不能被采用。析构函数不能声明为const,volatile,const volatile或static。 因此,您不必在创建对象时指定传递给构造函数的参数。
答案 5 :(得分:0)
构造函数可以重载但是析构函数不能重载。
创建对象时,会自动调用其合适的构造函数来初始化对象。当程序从内存中删除时,将调用每个对象的析构函数,以从对象池中删除这些未引用的对象。因为析构函数是清除对象池的系统例程。