C++构造函数、析构函数不太常见的知识点

关键字 构造函数 析构函数
原作者姓名 陈辉东
文章原始出处 [原创]
书籍作者 陈辉东

介绍
本文通过几个例子来讲关于构造函数和析构函数的几个不太常见知识点。

读者评分 24 评分次数 7

正文
构造函数和析构函数

众所周知,所谓构造函数就是一个类的对象(或实例)定义时,由系统自动调用的,用来为对象分配空间,进行初始化的特殊的成员函数;
而析构函数就是在对象撤消(如出了该对象的作用域)时由系统自动调用,用来回收存储空间,并做一些善后工作的特殊的成员函数。
本文不再讲述构造函数和析构函数的的详细知识,而是通过几个例子来讲关于构造函数和析构函数的几个不太常见知识点。
例一、不要改动下面main函数的内容,使程序输出结果为:
System initialize...
Hello, my dear friends!
System finish...

下面是该main函数的内容:
// Hello.cpp

#include <iostream.h>
int main(int ac, char *av[])
{
    cout<<"Hello, my dear friends!/n";
}

例二、下面程序的输出结果是什么?为什么?
#include <iostream.h>
class CHD
{
public:
    CHD()
    {
        cout<<m_age<<endl;
        CHD(20);
    }
    CHD(int age)
    {
        m_age = age;
        show();
    }
    void show()
    {
        cout<<m_age<<endl;
    }
private:
    int m_age;
    
};

int main(int ac, char *av[])
{
    CHD dongdong;
    dongdong.show();
    return 1;
}

如果上面这两个题目你都觉得很简单,那我觉得你没有必要再看下去了。
先来分析第一个题目。不能动main函数体的内容,想一想,正常人都可以想到跟本文所讲的构造函数和析构函数有关。可是main函数里根本就没有和类或类的对象扯上关系呀!这该怎么入手?
可以这样想,上面的“System initialize...”应该是类的构造函数里输出的内容,而“System finish...”则应该是类的析够函数里输出的内容。可是如何在不让main出手就能调用到类的构造函数和析构函数呢?
无可争议的一点是,调用构造函数应该要有该类的对象的存在。虽然在main里不存在任何对象,可是这个对象还是存在的,因此只能是在main外存在一个对象。因此该对象是一个全局对象。说开了,则写起来很简单(下面给出其中一种方法):

#include <iostream.h>

class Chd
{
public:
    Chd(){cout<<"System initialize.../n";};
    ~Chd(){cout<<"System finish.../n";};
}dongdong;

int main(int ac, char *av[])
{
    cout<<"Hello, my dear friends!/n";
    return 1;
}

再来分析第二个题目。
这个题目其实也不难,只要记住一个原则:构造函数和析构函数都是在类的对象(或实例)定义时由系统自动调用的,因此如果人为的去调用构造函数或析构函数,则系统会自动为这些构造函数和析构函数指定一个临时对象。
利用这个原则再去分析第二题,可以知道输出结果分别是:随机数(不同系统,不同编译工具结果不一样),20,随机数。
具体的原因,您可以根据以上的原则去分析。

其实,对于非系统调用的构造函数和析构函,可以发现一个规律: 当通过不同渠道调用同一个构造函数,且该构造函数里边又调用另一个构造函数,则系统在第二个构造函数里产生的临时对象都一样。

下面给出一个例子,这个例子将其执行的所有构造函数和析构函数的当前对象输出出来:
/*
*    文件名: CConstruct2
*    功能  : 测试类的构造函数
*    作者  : 陈辉东
*    日期  : 2006.1.3
*    备注  :
*/

#include <iostream.h>

class CHD
{
public:
    CHD(int age)
    {
        cout<<"CHD(int age) initialize... this:"<<this<<endl;
        m_age = age;
    };
    CHD()
    {
        cout<<"CHD() initialize...this:"<<this<<endl;
        CHD(23);    //显式调用构造函数,则系统会自动创建一个临时对象
    };
    CHD(int age, int height)
    {
        cout<<"CHD(int age, int height) initialize...this:"<<this<<endl;
        CHD(23);    //显式调用构造函数,则系统会自动创建一个临时对象
    };
    ~CHD(){cout<<"finish...this:"<<this<<endl;};
private:
    int m_age;
};

int main(int ac, char *av[])
{
    CHD dongdong;
    CHD::CHD();     //显式调用构造函数,则系统会自动创建一个临时对象
    cout<<"======  ========== =========="<<endl;
    CHD dongdong2(10, 160);
    CHD::CHD(20, 170);//显式调用构造函数,则系统会自动创建一个临时对象
    cout<<"======  ========== =========="<<endl;
    CHD dongdong1(15);
    CHD::CHD(20);//显式调用构造函数,则系统会自动创建一个临时对象

    cout<<"Hello world!/n";
    return 1;
}
/* 输出结果:(仅供参考)
CHD() initialize...this:0x0012FF70
CHD(int age) initialize... this:0x0012FEFC
finish...this:0x0012FEFC
CHD() initialize...this:0x0012FF64
CHD(int age) initialize... this:0x0012FEFC
finish...this:0x0012FEFC
finish...this:0x0012FF64
======  ========== ==========
CHD(int age, int height) initialize...this:0x0012FF6C
CHD(int age) initialize... this:0x0012FEF4
finish...this:0x0012FEF4
CHD(int age, int height) initialize...this:0x0012FF60
CHD(int age) initialize... this:0x0012FEF4
finish...this:0x0012FEF4
finish...this:0x0012FF60
======  ========== ==========
CHD(int age) initialize... this:0x0012FF68
CHD(int age) initialize... this:0x0012FF5C
finish...this:0x0012FF5C
Hello world!
finish...this:0x0012FF68
finish...this:0x0012FF6C
finish...this:0x0012FF70
Press any key to continue
*/

发布了33 篇原创文章 · 获赞 3 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章