-1

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

例子

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

int main(){
    A ob;
}

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

5)对象何时被释放?是在析构函数结束之前吗?

4

6 回答 6

2
  1. 在“A ob;”行。首先分配对象的存储空间,然后调用构造函数。
  2. 它是在对象构造函数调用之前。
  3. 如果构造函数没有完成它的工作 - 对象还没有创建。如果您在构造函数中遇到异常,则不会调用析构函数。
  4. 是的。您的对象不存在,但已分配。
  5. 对象在析构函数调用后被释放(或者如果构造函数中有异常则不调用)。

一些附加信息

于 2012-10-19T09:59:51.790 回答
0

当您进入定义它的范围时,就会创建该对象。

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

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

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

于 2012-10-19T09:56:00.430 回答
0

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

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

3)如果您使用默认构造函数,是的,您可以这样做

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

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

于 2012-10-19T09:56:19.590 回答
0
  1. 首先,class A分配实例的内存,包括其成员占用的内存。之后,构造函数A::A()被调用。
  2. 是的,见上文。
  3. 答案取决于您对“完全创建”的定义。在构造函数的主体中做几乎任何事情都是安全的,但有一些警告。最广为人知的是关于虚拟方法调用。
  4. 构造函数初始化列表是构造函数的一部分,它只是在控制流到达构造函数的左大括号之前执行。
  5. 销毁时,A::~A()首先调用析构函数,然后释放对象占用的内存。
于 2012-10-19T09:56:55.970 回答
0

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

于 2012-10-19T10:00:35.877 回答
0

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

  1. 内存分配发生在创建对象时(对您来说,它分配在堆栈上)
  2. 在创建对象时分配成员
  3. 创建对象后(在您的情况下,A ob
  4. 不,成员在构造函数创建时初始化
  5. 首先调用析构函数,然后释放

注意:标准с++没有指定静态成员的初始化顺序。这取决于编译器。

于 2012-10-19T10:14:11.053 回答