说我有:
class A
{
A()
{}
~A()
{}
};
class B
{
public:
B()
{}
~B()
{}
private:
static A mA;
};
B* pB = new B;
delete pB;
当我调用delete pB时,将调用B的析构函数。那么这会将析构函数称为静态成员A吗?
答案 0 :(得分:23)
关键字static表示该变量独立于实例。这就是为什么你可以访问静态变量和方法而不首先从类中实例化一个对象。这就是为什么销毁实例不会影响任何静态变量。
答案 1 :(得分:12)
当然不是。首先,您已经定义了一个显式的空析构函数。如果默认析构函数执行了此操作,则您永远不会破坏实例而不会冒使该类无法使用的风险。
答案 2 :(得分:7)
C ++标准03, 9.4.2静态数据成员:
静态数据成员不属于 一个类的子对象。有 只有静态数据成员的一个副本 由所有对象共享 class.class。
静态数据成员不属于该类 - 因此它不依赖于类的生命周期,也不依赖于构造或破坏。
建设(9.4.2 / 3)
静态数据成员之后 定义,即使没有对象也存在 已经创建了它的类的类。已经创建了它的类。
销毁(9.4.2 / 7)
静态数据成员的初始化和销毁与非本地对象完全相同。
答案 3 :(得分:1)
应用程序终止时,将破坏具有静态生命周期的对象。在程序中可能存在的各种静态对象中,以与构造对象的方式相反的顺序调用析构函数。
对象实例的构造/销毁对构造或销毁静态成员的时间没有影响。
答案 4 :(得分:1)
静态成员不会驻留在分配给该类实例的内存空间中。因此,它不会被删除或取消初始化,除非你在代码的任何部分显式地执行它(包括类析构函数,但你的代码逻辑必须处理具有多个实例的可能性等等)。
答案 5 :(得分:1)
静态变量也称为类变量。这与实例变量相反。正如这些名称所暗示的,类变量属于整个类,其中实例变量属于实例。可以基于这些事实推导出这些变量的寿命。
另一种看待这种情况的方法是假设调用析构函数实际上会破坏静态变量。想象一下,一个对象的后果被实例化然后被删除。将继续使用的类的所有其他对象共享的静态变量会发生什么。