C++对象构造的过程

340 阅读2分钟

在C++中,对象的构造过程涉及分配内存、初始化成员变量以及调用构造函数。这个过程可以根据对象是静态分配(如栈上分配)还是动态分配(如通过 new 关键字)有所不同。下面是构造对象时通常发生的步骤:

1. 内存分配

  • 对于栈上的对象,内存在进入对象所在的作用域时自动分配。
  • 对于通过 new 创建的对象,内存在 new 表达式执行时从堆上分配。

2. 成员变量初始化

  • 如果成员变量有初始值(C++11之后的特性),它们会首先被初始化。
  • 对于基础类型的成员变量,如果没有显式初始化,它们通常会保留未初始化的状态(除非是类的静态成员)。
  • 对于类类型的成员变量,会调用其相应的构造函数。

3. 构造函数的调用

  • 构造函数在所有成员变量初始化之后调用。
  • 如果是派生类对象,会先按照继承层次调用基类的构造函数,然后才是派生类的构造函数。
  • 构造函数可以有参数,允许在创建对象时传递值或信息。
  • 如果构造函数中有任何异常抛出且未在构造函数内部捕获,则对象的构造过程会被中断。

4. 完整的对象

  • 一旦构造函数执行完毕,对象就被视为完整的。
  • 此时,对象的所有成员变量都已初始化,对象准备好被使用。

构造函数的调用时机

  • 当创建类的实例时,无论是自动变量、静态变量还是动态分配的对象,构造函数都会被调用。
  • 对于静态或全局对象,其构造函数在 main 函数执行前调用。
  • 对于局部作用域的对象,其构造函数在控制流程到达对象定义的地方时调用。
  • 对于通过 new 创建的对象,其构造函数在 new 表达式中被调用。

示例

class Example {
public:
    Example() {
        // 构造函数内容
    }
};

int main() {
    Example obj; // 在这里,obj 的构造函数被调用
    return 0;
}

在上面的例子中,Example 类的实例 obj 被创建,其构造函数在 main 函数中 Example obj; 这行代码执行时被调用。