您的位置:首页 > 编程语言 > C语言/C++

宋体、构造函数-浅出C++对象模型——理解构造函数、析构函数执行顺序-by小雨

2013-04-17 14:07 417 查看
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,码代几天不写就忘。目前又不当COO,还是得用心记码代哦!

本文重要说明象对建创时结构函数的执行序次,象对成员的初始化序次;象对毁销时析构函数的执行序次,象对成员的毁销序次。

“象对的结构从类层次的最根处开始,在每一层中,首先调用基类的结构函数,然后调用成员象对的结构函数。析构则格严按照与结构相反的序次执行,该序次是独一的,否则译编器将没法动自执行析构程过。

一个趣有的现象是,成员象对初始化的序次全完不受它们在初始化表中序次的影响, 只由成员象对在类中声明的序次决议。这是因为类的声明是独一的,而类的结构函数可以有多个,因此会有多个不同序次的初始化表。如果成员象对按照初始化表的序次行进结构,这将致使析构函数没法到得独一的逆序。”(引用自References[1])

从这里看,每种言语特性的存在必有其因原,习学这些特性就是懂得这些特性存在的因原。

面下的一段码代是对面下这段话的说明,其中有4个类Foo, Bar, Base, Derived,它们的结构函数、拷贝结构函数、析构函数都有息信输出。

#include <iostream>
using namespace std;

class Foo
{
public:
Foo() { cout << "Foo constructor" << endl; }
Foo(const Foo &foo) { cout << "Foo copy constructor" << endl; }
~Foo() { cout << "Foo deconstructor" << endl; }
};

class Bar
{
public:
Bar() { cout << "Bar constructor" << endl; }
Bar(const Bar &bar) { cout << "Bar copy constructor" << endl; }
~Bar() { cout << "Bar deconstructor" << endl; }
};

class Base
{
public:
Base() { cout << "Base constructor" << endl; }
~Base() { cout << "Base deconstructor" << endl; }
};

class Derived : public Base
{
public:
Derived() { cout << "Derived constructor without arguments" << endl; }
Derived(const Foo &foo, const Bar &bar);
Derived(const Bar &bar, const Foo &foo);
~Derived() { cout << "Derived deconstructor" << endl; }

private:
Foo m_foo;
Bar m_bar;
};

Derived::Derived(const Foo &foo, const Bar &bar) :
m_foo(foo),
m_bar(bar)
{
cout << "Derived constructor with argument[Foo foo, Bar bar] passed by references" << endl;
}

Derived::Derived(const Bar &bar, const Foo &foo) :
m_bar(bar),
m_foo(foo)
{
cout << "Derived constructor with argument[Bar bar, Foo foo] passed by references" << endl;
}

int main (int argc, char** argv)
{
Foo foo;
Bar bar;

cout << "test case 1:" << endl;
Derived deri_1;  //  (1)

cout << "test case 2:" << endl;
Derived deri_2(foo, bar);   //  (2)

cout << "test case 3:" << endl;
Derived deri_3(bar, foo);   //  (3)

cout << "test case end" << endl;

return 0;
}

执行结果是:



打印出的息信可分为几部份:

(1) 建创象对foo和bar ,执行Foo,Bar的结构函数

(2) Test Case 1:建创象对deri_1,首先执行基类Base的结构函数,其次执行成员m_foo,m_bar的结构函数来结构成员,最后调用自身的结构函数(无参数)。

(3) Test Case 2:建创象对deri_2,调用序次与case 1序次同相。

(4) Test Case 3:建创象对 deri_3,调用序次与case 1序次同相。注意到deri_2,deri_3的建创执行的是不同的Derived结构函数,虽然结构函数参数的序次不同,但是结构成员的序次是同相的。

(5) 毁销象对deri_3,deri_2,deri_1,析构函数执行序次同相,与结构象对的序次相反。C++标准划定以象对声明相反的序次毁销这些象对。

(6) 毁销象对bar,foo。

译编运行环境:

$ uname -a
Linux localhost.localdomain 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

$ g++ --version
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)

References:

[1]高质量C++编程指南: http://oss.org.cn/man/develop/c&c++/c/c.htm

[2] http://stackoverflow.com/q/15948381/1145750

转载本文请注明作者和出处http://garyelephant.me,请勿用于任何商业用途!

Author: Gary Gao 存眷互联网、动自化、件软团队

文章结束给大家分享下程序员的一些笑话语录: 女人篇

  有的女人就是Windows虽然很优秀,但是安全隐患太大。

  有的女人就是MFC她条件很好,然而不是谁都能玩的起。

  有的女人就是C#长的很漂亮,但是家务活不行。

  有的女人就是C++,她会默默的为你做很多的事情。

  有的女人就是汇编虽然很麻烦,但是有的时候还得求它。

  有的女人就是SQL,她会为你的发展带来莫大的帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐