在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; 这行代码执行时被调用。