c ++用户定义的类型生存期

时间:2012-10-19 09:41:56

标签: c++ constructor lifetime

我想知道创建用户定义类型的对象的过程是什么。

实施例

class A{
    int a; 
    void f();
    int b;
    A() /*initialization list*/ {}
};

int main(){
    A ob;
}

1)我想知道对象何时被分配,以及A的构造函数何时被调用。
2)其成员何时获得分配?是否同时对象本身被分配?
3)我什么时候可以说对象是完全创建的并且可以安全使用?它只是在构造函数的开头之后,还是直到构造函数的结尾? 4)我知道成员在构造函数初始化列表中初始化,所以它在构造函数的调用之前。这是否意味着成员在对象存在之前存在?

5)什么时候对象被解除分配?它是在析构函数结束之前吗?

6 个答案:

答案 0 :(得分:2)

  1. 在" A ob;"。首先分配对象的存储,然后调用构造函数。
  2. 就在对象构造函数调用之前。
  3. 如果构造函数没有完成它的工作 - 对象尚未创建。如果构造函数中有异常,则不会调用析构函数。
  4. 是。您的对象不存在,但已分配。
  5. 在析构函数调用之后释放对象(如果构造函数中有异常,则不调用它)。
  6. 一些额外的info

答案 1 :(得分:0)

当您输入定义它的范围时,将创建该对象。

首先分配对象,然后调用其构造函数。您可以在构造函数执行结束时使用对象。分配对象会保留sizeof(A),因此每个成员都会同时分配(这就是为什么这些成员被称为成员)。

在执行构造函数之前调用初始化列表,但此时它已经被分配,因此可以安全地初始化它们,因为您的对象存在。

对象在析构函数执行结束时被处理掉,而不是之前。

答案 2 :(得分:0)

1)在你的A ob;行,但它将被分配到堆栈上,而不是堆上!

2)所以构造函数将被调用,所以是的。

3)如果使用默认构造函数,则可以执行

4)看起来像3一样的问题,所以是的

5)不,你可以访问析构函数中的成员

答案 3 :(得分:0)

  1. 首先,分配class A实例的内存,包括其成员占用的内存。然后,调用构造函数A::A()
  2. 是的,见上文。
  3. 答案取决于您对“完全创建”的定义。在构造函数体中做几乎任何事都是安全的,但有一些注意事项。最着名的是虚拟方法调用。
  4. 构造函数初始化列表是构造函数的一部分,它只是在控制流到达构造函数的左括号之前执行。
  5. 在销毁时,首先调用析构函数A::~A(),然后释放对象占用的内存。

答案 4 :(得分:0)

1。在调用对象构造函数时将分配对象,并在创建类的对象时调用对象构造函数。
2。
3。在构造函数的末尾,因为必须初始化所有成员 4。 5. 调用析构函数后。

答案 5 :(得分:0)

首先,您应该将构造函数声明为您的类的公共部分。

  1. 创建对象时会发生内存分配(对您而言) 在堆栈上分配)
  2. 成员在对象创建时被分配
  3. 创建对象后(在您的情况下,A ob
  4. 不,成员在构造函数创建时初始化
  5. 首先调用析构函数,然后释放
  6. 注意:标准的с++没有指定静态成员的初始化顺序。这取决于编译器。