构造函数执行多少次?

1. 构造函数执行多少次?

如果MyClass是一个类,执行MyClass a[5],*b[6];,构造函数执行几次?–>执行5次.

执行构造函数,就是开始构造对象,为对象划分内存;同理如果给指针new 一个内存空间时,就会调用构造函数;

MyClass a[5],*b[6];
            //a[5]:生成一个数组,会分配5个对象;
            // *b[6]:生成一个指针数组,每一个元素可以指向一个数据类型为MyClass对象;但是,此时还没分配内存;


A a[5];
A *b[6];
for(int i=0;i<6;i++)
{
    b[i]=new A;//为b的每一个对象分配内存空间;
}

//此时,构造函数会调用11次;
构造函数的扩展过程是指在 C++ 中,构造函数如何初始化基类、成员变量以及处理各种复杂的初始化场景。以下详细讨论构造函数执行顺序、扩展过程以及相关注意事项。 --- ### **1. 构造函数的扩展过程** #### **(1) 初始化基类** - 如果一个类继承自另一个类,则首先调用基类的构造函数。 - 基类的构造函数可以通过派生类的成员初始化列表显式调用,否则会调用基类的默认构造函数。 #### **(2) 初始化成员变量** - 按照成员变量在类中声明的顺序进行初始化(与成员初始化列表中的顺序无关)。 - 成员变量可以使用默认构造函数或通过成员初始化列表显式初始化。 #### **(3) 执行构造函数体** - 在基类和成员变量都初始化完成后,执行派生类构造函数的函数体。 --- ### **2. 代码示例** #### **(1) 基类和派生类的构造顺序** ```cpp #include <iostream> using namespace std; class Base { public: Base() { cout << "Base Constructor" << endl; } }; class Derived : public Base { private: int value; public: Derived(int v) : value(v) { // 成员初始化列表 cout << "Derived Constructor, value: " << value << endl; } }; int main() { Derived obj(42); // 输出:Base Constructor -> Derived Constructor, value: 42 return 0; } ``` #### **(2) 复杂初始化场景** ```cpp #include <iostream> using namespace std; class Base { public: Base(int x) { cout << "Base Constructor with parameter: " << x << endl; } }; class MemberClass { public: MemberClass(int y) { cout << "MemberClass Constructor with parameter: " << y << endl; } }; class Derived : public Base { private: MemberClass member; public: Derived(int x, int y) : Base(x), member(y) { // 显式初始化基类和成员变量 cout << "Derived Constructor" << endl; } }; int main() { Derived obj(10, 20); // 输出:Base Constructor with parameter: 10 // MemberClass Constructor with parameter: 20 // Derived Constructor return 0; } ``` --- ### **3. 解释** #### **(1) 初始化基类** - 派生类的构造函数会先调用基类的构造函数。 - 如果没有显式指定基类构造函数,则会调用基类的默认构造函数。 - 如果基类没有默认构造函数,则必须通过派生类的成员初始化列表显式调用基类的构造函数。 #### **(2) 初始化成员变量** - 成员变量按照在类中声明的顺序进行初始化,而不是按照成员初始化列表中的顺序。 - 如果某个成员变量没有在成员初始化列表中显式初始化,则会调用其默认构造函数(如果有)。 #### **(3) 执行构造函数体** - 在基类和成员变量都初始化完成后,才会执行派生类构造函数的函数体。 --- ### **4. 注意事项** - **避免重复初始化**:如果在成员初始化列表中已经初始化了某个成员变量,则不要在构造函数体内再次赋值。 - **引用和常量成员**:引用和常量成员必须在成员初始化列表中初始化。 - **虚函数的调用**:在构造函数调用虚函数时,只会调用当前类的版本,而不会调用派生类的重写版本。 --- ### **5. 总结** 构造函数的扩展过程包括初始化基类、初始化成员变量以及执行构造函数体。了解这一过程对于正确设计继承关系和初始化逻辑非常重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值