第46课 继承中的构造与析构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第46课 继承中的构造与析构相关的知识,希望对你有一定的参考价值。
1. 子类对象的构造
(1)子类中可以定义构造函数
(2)子类构造函数,必须对继承而来的成员进行初始化,有两种方式
①直接通过初始化列表进行初始化或赋值的方式进行初始化
②调用父类构造函数进行初始化
(3)父类构造函数在子类中调用方式
①默认调用:适用于无参构造函数和使用默认参数的构造函数
②显式调用:通过初始化列表进行调用,适用于所有父类构造函数
【编程实验】子类的构造初探
#include <iostream> #include <string> using namespace std; class Parent { public: Parent() { cout << "Parent()" << endl; } Parent(string s) { cout <<"Parent(string s): " << s << endl; } }; class Child : public Parent { public: Child() //这里虽然没写,但会默认调用父类无参构造函数 { cout << "Child()" << endl; } //在初始化列表中显式调用父类带参的Parent(string s)构造函数 //如果不显式调用,则会默认调用父类无参的Parent()构造函数 Child(string s) : Parent(s) { cout << "Child(string s): " << s << endl; } }; int main() { Child c; Child cc("cc"); return 0; } //c output: // Parent() // Child() //cc output: // Parent(string s): cc // Child(string s): cc
2. 构造规则
(1)子类对象在创建时会首先调用父类的构造函数
(2)先执行父类构造函数,再执行子类的构造函数
(3)父类构造函数可以被隐式调用或显式调用
3. 对象创建时构造函数的调用顺序(口决:先父母、后客人,再自己)
(1)先调用父类的构造函数
(2)再调用成员变量的构造函数(注意,这里的顺序与成员变量声明顺序相同!)
(3)最后调用类自身的构造函数
4. 析构函数的调用顺序与构造函数相反
(1)先执行自身的析构函数
(2)再执行成员变量的析构函数
(3)最后执行父类的析构函数
【编程实验】对象的构造和析构深度解析
#include <iostream> #include <string> using namespace std; class Object { string ms; public: Object(string s) { ms = s; cout << "Object(string s): " << s << endl; } ~Object() { cout << "~Object(): " << ms << endl; } }; class Parent : public Object { string ms; public: Parent(): Object("Default") //必须显式调用,因为父类Object没有提供无参构造函数,而默认 //调用只会调用无参(或带默认参数)的构造函数 { ms = "Default"; cout << "Parent()" << endl; } Parent(string s): Object(s) { ms = s; cout <<"Parent(string s): " << s << endl; } ~Parent() { cout << "~Parent(): " << ms << endl; } }; class Child : public Parent { Object mO1; Object mO2; string ms; public: Child(): mO1("Default 1"),mO2("Default 2") //默认调用Parent()进行初始化 { ms = "Default"; cout << "Child()" << endl; } //在初始化列表中显式调用父类带参的Parent(string s)构造函数,并对成员变量 //mO1和mO2进行初始化 Child(string s) : Parent(s),mO1(s + " 1"),mO2(s + " 2") { ms = s; cout << "Child(string s): " << s << endl; } ~Child() { cout << "~Child(): " << ms << endl; } }; int main() { Child cc("cc"); cout << endl; return 0; } /*输出结果: Object(string s): cc Parent(string s): cc //父类初始化完毕 Object(string s): cc 1 Object(string s): cc 2 //成员变量初始化完毕 Child(string s): cc //自身的初始化 ~Child(): cc //析构自身 ~Object(): cc 2 ~Object(): cc 1 //析构成员变量完毕 ~Parent(): cc ~Object(): cc //析构父类 */
5. 小结
(1)子类对象在创建时需要调用父类构造函数进行初始化
(2)先执行父类构造函数然后执行成员构造函数
(3)父类构造函数显式调用需要在初始化列表中进行
(4)子类对象在销毁时需要父类析构函数进行清理
(5)析构顺序与构造顺序对称相反
以上是关于第46课 继承中的构造与析构的主要内容,如果未能解决你的问题,请参考以下文章