`

《C++学习笔记》子对象构造函数和析构函数的调用顺序

    博客分类:
  • C++
阅读更多
===============================================
未完待续,转载时请表明出处:http://www.cofftech.com/thread-1399-1-1.html
欢迎大家跟帖讨论哈~~~~~
===============================================
[例1]子对象的构造函数和析构函数的调用顺序
// cons_des_subobj_1.cpp
// To show the order in which the constructors and destructors are called
// 用于显示调用顺序的语句以下划线标出,其余语句均与程序initab_5.cpp相同

#include <iostream.h>
class sub_class {
        int x;
public:
        sub_class (int a)        { x = a;
          cout<<"Constructor_sub : "<<x<<" called!"<<endl;               
}
        ~sub_class()        {        cout<<"Destructor_sub : "<<x<<" called!"<<endl;        }
        void display( )        { cout<<x<<endl; }
};

class comp_class {
        int y;
        sub_class sub_obj_1;        // a data member
        sub_class sub_obj_2;        // another data member
public:
        comp_class (int a, int b, int c);        //declaring the constructor
        void display_comp( )        { cout<<"comp_class::y : "<<y<<endl; }
        void display_sub_1( )        { cout<<"sub_obj_1.x : ";        sub_obj_1.display( ); }
        void display_sub_2( )        { cout<<"sub_obj_2.x : ";        sub_obj_2.display( ); }
        ~comp_class()       
        {          cout<<"Destructor_comp "<<y<<" called!"<<endl;        }
};

comp_class::comp_class (int a, int b, int c):sub_obj_1(b), sub_obj_2(c)               
// constructor with initialization table
{
        y = a;
        cout<<"Constructor_comp : "<<y<<" called!"<<endl;
}

void main()
{
        comp_class obj(10, 20, 30);
        obj.display_comp();
        obj.display_sub_1();
        obj.display_sub_2();
}

/* Results:
Constructor_sub : 20 called!
Constructor_sub : 30 called!
Constructor_comp : 10 called!
comp_class::y : 10
sub_obj_1::x : 20
sub_obj_2::x : 30
Destructor_comp 10 called!
Destructor_sub : 30 called!
Destructor_sub : 20 called!
*/
以上程序中,系统先调用子对象的构造函数,后调用组合对象(主对象)的构造函数。。
此外,调用对象成员的析构函数的顺序正好与调用构造函数的顺序相反。 如果在成员初始化列表中将顺序颠倒为:
comp_class::comp_class (int a, int b, int c) : sub_obj_2(c), sub_obj_1(b)        {        ……        } 则运行结果仍然不变。
但如改变comp_class类体中对象成员的排列顺序,例如:
class comp_class {                int y;
        sub_class  sub_obj_2;        // another data member
        sub_class  sub_obj_1;        // a data member
        ……                ……        }
则运行结果变为:
Constructor_sub : 30 called!
Constructor_sub : 20 called!
Constructor_comp : 10 called!
……                ……
Destructor_comp 10 called!
Destructor_sub : 20 called!
Destructor_sub : 30 called!
由此可见:调用对象成员(子对象)的构造函数的顺序只决定于复合类体中各子对象的排列顺序。而与成员初始化列表中的顺序(sub_obj_1(b), sub_obj_2(c))无关。
分享到:
评论

相关推荐

    学习笔记 c++ 面试

    在C++编程语言中,面试时常涉及的关键概念包括构造函数、虚函数、虚继承以及对象内存布局等。这些是理解C++面向对象编程基础的重要组成部分。 1. **构造函数**: - 构造函数是类的一个特殊成员函数,用于初始化新...

    《Inside the C++ Object Model》笔记(1~7章)

    默认构造函数是C++中自动提供的构造函数,如果没有显式定义任何构造函数,编译器会自动生成一个默认构造函数。这个构造函数负责初始化类中的所有非静态成员变量,并执行一些基本的初始化任务。如果类中有需要特别...

    C++&C学习笔记

    ### C++&C学习笔记知识点概览 #### 类与数据抽象 - **概念**:类是一种用户自定义的数据类型,它将数据(属性)和作用于数据上的操作(方法)封装在一起,从而实现了数据的抽象。 - **特点**:与C语言中的结构体...

    C++源码 笔记.

    在压缩包的文件名列表中,"c++源码 笔记"可能是文件夹或者文档的名字,里面可能包含了多个子文件,比如每个子文件可能对应一个特定的C++主题,如函数、类的实现、模板的应用等等。这些子文件可能包含详细的代码注释...

    c++教案 谭浩强 学习c++的学生

    构造函数用于初始化新创建的对象,而析构函数在对象生命周期结束时被调用,用于清理资源。这些函数的名字与类名相同,但构造函数无返回类型,析构函数为void类型。 5. **指针与引用** 指针是C++中强大的工具,它...

    _C++程序设计

    对象是类的实例,通过构造函数和析构函数进行创建和销毁。谭浩强教授详细阐述了封装、继承和多态这三个面向对象的基本特征。 6. **指针**:C++中的指针是其强大之处,也是初学者的一大挑战。指针可以用来动态分配...

    JAVA学习笔记

    通过讲解this关键字、继承、static关键字和代码块、final关键字、多态、方法重写、抽象类与接口、封装与隐藏、垃圾回收、类组合、包装类、对象处理、类成员、final修饰符详解等知识点,本文档为Java学习者提供了一套...

    MFC学习笔记

    **MFC 学习笔记** MFC(Microsoft Foundation Classes)是微软开发的一种C++类库,用于构建Windows应用程序。它提供了面向对象的编程接口,使得开发者可以更容易地使用Windows API。MFC的主要目标是简化Windows应用...

    java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...

    QT_学习笔记widget

    它的构造函数接受`main`函数中的`argc`和`argv`作为参数。 #### 二、Widget概述 Widget是QT中最基本的图形界面元素之一,它是所有可视控件的基础类。 - **Widget的特性**: - **初始状态**:Widget被创建时默认...

    c#学习笔记.txt

    使用 new 运算符创建结构对象时,将创建该结构对象,并且调用适当的构造函数。与类不同的是,结构的实例化可以不使用 new 运算符。如果不使用 new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。...

    QT_学习笔记widget_MainWindow和Dialog的选择使用

    ### QT_学习笔记:Widget, MainWindow 和 Dialog 的选择使用 #### 概述 本文档旨在深入探讨Qt框架中关于`QWidget`, `QMainWindow`, 以及`QDialog`的基础概念及应用技巧,帮助开发者理解如何根据具体需求选择合适的...

    C#学习笔记-25个经典问题.pdf

    接口包含方法、属性、事件和索引器,但不能包含字段和构造函数,且所有成员默认为 public abstract。 16. 类与结构的区别 类是引用类型,结构是值类型。类可以继承,结构不能。类实例化使用“new”关键字,结构...

    java学习笔记整理

    ### Java学习笔记整理 #### 1. Java简介 ##### 1.1 计算机编程和开发语言 计算机系统由硬件系统和软件系统组成。软件系统又进一步细分为系统软件和应用软件。其中,系统软件包括操作系统、编译系统、数据库系统等...

    OOP高级编程笔记

    - **拷贝构造函数**:创建对象的副本。 - **赋值运算符**:实现对象间的赋值操作。 - **避免麻烦**:避免设计中常见的陷阱和错误。 #### 八、继承复习 - **避免重复**:通过继承减少代码重复。 - **重定义函数**:...

    QT笔记大神编写值得下载加油

    接下来的代码展示了如何使用构造函数来初始化对象,并设置窗口标题和控件的属性。 6. 代码片段中的类定义和命名空间: 笔记中的代码包含了多个类的定义,比如Cal类继承自QMainWindow。QMainWindow是QT中用于创建主...

    java学习笔记

    ### Java学习笔记知识点详解 #### 一、Java基础知识概述 Java是一种广泛使用的面向对象的编程语言,具有简单性、面向对象、健壮性、安全性、平台独立性、可移植性等特点。Java的基本知识包括以下几个方面: 1. **...

    编程笔记概要

    对于类类型的对象,则会调用其默认构造函数。 - **显式初始化**:程序员明确地给变量赋初值,比如 `int i = 0;` 这种形式就是显式初始化。 - **初始化的最佳实践**: - 始终显式初始化变量。 - 使用现代 C++ 的...

    CPP-Notes

    【压缩包子文件的文件名称列表】"CPP-Notes-main" 可能是一个主目录,包含了整个C++学习笔记的结构和内容,可能包含子目录如“基础知识”、“进阶主题”、“实例代码”等,以及各种源代码文件(.cpp)和相关的解释性...

    My-Learning-Notes

    2. **类与对象**:讲解C++中的面向对象特性,如封装、继承和多态,以及构造函数、析构函数、友元函数等。 3. **指针与内存管理**:深入理解指针的概念,如何动态分配和释放内存,以及理解堆栈和堆的区别。 4. **...

Global site tag (gtag.js) - Google Analytics