===============================================
未完待续,转载时请表明出处:
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++构造函数和析构函数的调用顺序举例一.调用方法和区别1、构造函数的调用顺序: 基类构造函数、对象成员构造函数、派生类本身的构造函数 2、析构函数的调用顺序:
C++构造函数,复制构造函数和析构函数专题[1].pdf C++继承,虚函数与多态性专题.pdf
C++学习资料,学习面向对象语言的朋友可以看看,绝对有用,个人很喜欢
C++构造函数、复制构造函数和析构函数专题(修订版).pdf
c++程序设计第十章构造函数和析构函数
该视频更好介绍C++的构造函数和析构函数
C++构造函数、复制构造函数和析构函数专题(修订版)[汇编].pdf
成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序。 3.派生类构造函数。 析构函数 析构函数的调用顺序与构造函数的调用顺序...
构造函数的调用可以追踪。。。。由于构造函数和析构函数都是自动吊桶的或者更不饿,我们可以自己设立函数来追踪构造函数的调用过称。
调用构造函数和析构函数的顺序:先构造的后析构,后构造的先折构。它相当于一个栈,先进后出。 代码如下:#include<iostream>#include<string>using namespace std;class Student{ public: Student(string,string,...
C++中的构造函数、析构函数剖析 在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 ...“构造函数”和“析构函数”的调用顺序
C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar
一道很好的习题代码,包含构造、析构、拷贝、重载
C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数 C++类对象的拷贝构造函数
3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用” 4、请设计一个析构函数,同时输出“析构函数被调用” 5、设计一个成员函数 int dayDiff(CTime t) ,用于计算...
类的成员有数据成员与函数成员两类,类的数据成员和函数成员统称为类的 成员,类的数据成员一般用来描述该类对象的属性,称为属性;函数成员是描 述类行为,称作方法。函数成员由函数构成,这些作为类成员的函数...
C++ 语言一直被批评太复杂了,很多细节的地方需要仔细推敲,甚至其构造函数和析构的调用顺序也成为了一个让人迷惑的问题,在此我做了简单的总结。这篇文章主要介绍了C++中构造函数与析构函数的调用顺序,需要的朋友...
简单的c++常识,类的定义,构造函数和析构函数
C++ 拷贝构造函数 赋值构造函数 解释