C++学习(五十二)父类构造函数和初始列表的顺序

博客指出在相关操作中,先执行父类构造函数,再执行初始列表,这是信息技术中关于程序执行顺序的关键信息。

先执行父类构造函数,再执行初始列表

<think>我们正在讨论C++中如何在子类构造函数中显式调用父类构造函数。根据引用[2]引用[3]的说明,当父类没有默认构造函数或子类需要调用父类的带参构造函数时,必须在子类构造函数初始化列表中显式调用父类构造函数。 引用[4]提供了一个简单的代码示例: class A { public: A() { printf("A(void) \n"); } A(int d) { printf("A %d\n", d); } }; class B : public A { public: B() { printf("B(void) \n"); } // 这里隐式调用了A的默认构造函数 B(int x) : A(x) { printf("B \n"); } // 显式调用A的带参构造函数 }; 在子类B的带参构造函数中,我们使用初始化列表语法`: A(x)`来显式调用父类A的带参构造函数。 另一个例子来自引用[3]中的fish类: class animal { public: animal(int height, int weight) { ... } }; class fish: public animal { public: fish(): animal(400,300) { ... } // 显式调用父类的带两个参数的构造函数 }; 因此,我们可以总结出:当需要调用父类的特定构造函数时,在子类构造函数初始化列表中写出父类构造函数的调用形式。 下面给出一个更简洁的示例: </think>在C++中,当子类构造函数需要显式调用父类构造函数时,需在子类构造函数的**初始化列表**中完成。以下是简单示例及解析: ### 基本语法 ```cpp class Parent { public: Parent(int param) { /* 父类构造函数 */ } // 带参数的父类构造函数 }; class Child : public Parent { public: Child(int value) : Parent(value) // ✨ 关键:在初始化列表显式调用父类构造函数 { /* 子类构造函数体 */ } }; ``` ### 完整示例 ```cpp #include <iostream> using namespace std; // 父类 class Base { public: Base(int val) { // 带参数的构造函数 cout << "Base构造: " << val << endl; } }; // 子类 class Derived : public Base { public: Derived(int x, int y) : Base(x) // ✅ 显式调用父类带参构造函数 { cout << "Derived构造: " << y << endl; } }; int main() { Derived obj(10, 20); // 创建子类对象 } ``` **输出结果**: ``` Base构造: 10 Derived构造: 20 ``` ### 关键规则解析 1. **必须显式调用的情况**: - 父类**没有默认构造函数**(无参构造) - 父类默认构造函数**不可访问**(如`private`修饰)[^1] ```cpp class Base { public: Base(int val); // 只有带参构造,无默认构造 }; ``` 2. **初始化顺序**: ```mermaid graph LR A[父类构造函数] --> B[子类成员初始化] B --> C[子类构造函数体] ``` 3. **语法要点**: - 父类构造函数的调用**必须放在初始化列表开头** - 参数传递方式与普通函数调用一致 - 若父类有默认构造,可省略显式调用(但不推荐)[^2] ### 错误示例 ```cpp class Derived : public Base { public: Derived(int x) { Base(x); // ❌ 错误!不能在构造函数体内调用 } }; ``` > 此语法确保对象初始化符合C++的严格生命周期规则:**先构造父类,再构造子类**[^2][^3]。实际代码可参考工程实践中的类模板初始化[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值