===============================================
未完待续,转载时请表明出处:
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++面向对象编程基础的重要组成部分。 1. **构造函数**: - 构造函数是类的一个特殊成员函数,用于初始化新...
默认构造函数是C++中自动提供的构造函数,如果没有显式定义任何构造函数,编译器会自动生成一个默认构造函数。这个构造函数负责初始化类中的所有非静态成员变量,并执行一些基本的初始化任务。如果类中有需要特别...
### C++&C学习笔记知识点概览 #### 类与数据抽象 - **概念**:类是一种用户自定义的数据类型,它将数据(属性)和作用于数据上的操作(方法)封装在一起,从而实现了数据的抽象。 - **特点**:与C语言中的结构体...
在压缩包的文件名列表中,"c++源码 笔记"可能是文件夹或者文档的名字,里面可能包含了多个子文件,比如每个子文件可能对应一个特定的C++主题,如函数、类的实现、模板的应用等等。这些子文件可能包含详细的代码注释...
构造函数用于初始化新创建的对象,而析构函数在对象生命周期结束时被调用,用于清理资源。这些函数的名字与类名相同,但构造函数无返回类型,析构函数为void类型。 5. **指针与引用** 指针是C++中强大的工具,它...
对象是类的实例,通过构造函数和析构函数进行创建和销毁。谭浩强教授详细阐述了封装、继承和多态这三个面向对象的基本特征。 6. **指针**:C++中的指针是其强大之处,也是初学者的一大挑战。指针可以用来动态分配...
通过讲解this关键字、继承、static关键字和代码块、final关键字、多态、方法重写、抽象类与接口、封装与隐藏、垃圾回收、类组合、包装类、对象处理、类成员、final修饰符详解等知识点,本文档为Java学习者提供了一套...
**MFC 学习笔记** MFC(Microsoft Foundation Classes)是微软开发的一种C++类库,用于构建Windows应用程序。它提供了面向对象的编程接口,使得开发者可以更容易地使用Windows API。MFC的主要目标是简化Windows应用...
### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...
它的构造函数接受`main`函数中的`argc`和`argv`作为参数。 #### 二、Widget概述 Widget是QT中最基本的图形界面元素之一,它是所有可视控件的基础类。 - **Widget的特性**: - **初始状态**:Widget被创建时默认...
使用 new 运算符创建结构对象时,将创建该结构对象,并且调用适当的构造函数。与类不同的是,结构的实例化可以不使用 new 运算符。如果不使用 new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。...
### QT_学习笔记:Widget, MainWindow 和 Dialog 的选择使用 #### 概述 本文档旨在深入探讨Qt框架中关于`QWidget`, `QMainWindow`, 以及`QDialog`的基础概念及应用技巧,帮助开发者理解如何根据具体需求选择合适的...
接口包含方法、属性、事件和索引器,但不能包含字段和构造函数,且所有成员默认为 public abstract。 16. 类与结构的区别 类是引用类型,结构是值类型。类可以继承,结构不能。类实例化使用“new”关键字,结构...
### Java学习笔记整理 #### 1. Java简介 ##### 1.1 计算机编程和开发语言 计算机系统由硬件系统和软件系统组成。软件系统又进一步细分为系统软件和应用软件。其中,系统软件包括操作系统、编译系统、数据库系统等...
- **拷贝构造函数**:创建对象的副本。 - **赋值运算符**:实现对象间的赋值操作。 - **避免麻烦**:避免设计中常见的陷阱和错误。 #### 八、继承复习 - **避免重复**:通过继承减少代码重复。 - **重定义函数**:...
接下来的代码展示了如何使用构造函数来初始化对象,并设置窗口标题和控件的属性。 6. 代码片段中的类定义和命名空间: 笔记中的代码包含了多个类的定义,比如Cal类继承自QMainWindow。QMainWindow是QT中用于创建主...
### Java学习笔记知识点详解 #### 一、Java基础知识概述 Java是一种广泛使用的面向对象的编程语言,具有简单性、面向对象、健壮性、安全性、平台独立性、可移植性等特点。Java的基本知识包括以下几个方面: 1. **...
对于类类型的对象,则会调用其默认构造函数。 - **显式初始化**:程序员明确地给变量赋初值,比如 `int i = 0;` 这种形式就是显式初始化。 - **初始化的最佳实践**: - 始终显式初始化变量。 - 使用现代 C++ 的...
【压缩包子文件的文件名称列表】"CPP-Notes-main" 可能是一个主目录,包含了整个C++学习笔记的结构和内容,可能包含子目录如“基础知识”、“进阶主题”、“实例代码”等,以及各种源代码文件(.cpp)和相关的解释性...
2. **类与对象**:讲解C++中的面向对象特性,如封装、继承和多态,以及构造函数、析构函数、友元函数等。 3. **指针与内存管理**:深入理解指针的概念,如何动态分配和释放内存,以及理解堆栈和堆的区别。 4. **...