小甲鱼C++视频的一个问题,关于析构函数

刚在看小甲鱼C++视频的第十五讲:不是每滴牛奶都叫特仑苏(构造器和析构函数讲解)
先上代码,然后来说下我的不解:

 

#include <iostream>
#include <string>
#include <fstream>

class StoreQuote
{
public:
        std::string quote, speaker;
        std::ofstream fileOutput;
        
        StoreQuote();
        ~StoreQuote();
        
        void inputQuote();
        void inputSpeaker();
        bool write();        
};

StoreQuote::StoreQuote()
{
        fileOutput.open("test.txt", std::ios::app);
}

StoreQuote::~StoreQuote()
{
        fileOutput.close();
}

void StoreQuote::inputQuote()
{
        std::getline(std::cin, quote);
}

void StoreQuote::inputSpeaker()
{
        std::getline(std::cin, speaker);
}

bool StoreQuote::write()
{
        if( fileOutput.is_open() )
        {
                fileOutput << quote << "|" << speaker << "\n";
                return true;
        }
        else
        {
                return false;
        }
}

int main()
{
        StoreQuote quote;
        
        std::cout << "请输入一句名言:\n";
        quote.inputQuote();
        
        std::cout << "请输入作者:\n";
        quote.inputSpeaker();
        
        if( quote.write() )
        {
                std::cout << "成功写入文件^_^";
        }
        else
        {
                std::cout << "写入文件失败T_T";
                return 1;
        }
        
        return 0;
}

 

 从以上的代码可以看出,小甲鱼虽然有给析构函数 添加实现代码,但是在main函数中并没有调用析构函数。
于是我的不解就来了,难道析构函数跟构造函数一样会自己自动调用?如果自己自动调用的话,那又是何时去调用呢?系统如何判断什么时候该调用呢???
本人C++菜鸟,还请各位大神指点一二。

版主回答+个人理解:

对象生命周期结束的时候将自动调用析构函数。这个例子里,就是局部对象quote在main函数结束的时候自动调用析构函数。析构函数也可以自己主动调用,但是这不是常规的做法。在你真的成为高手之前不要这么做。

 

在直接声明对象的情况下(如上代码),在编译器编译链接的过程中就把析构函数的汇编代码写进了exe,编译器帮你判断了哪里是你的局部对象结束的位置。

但是动态new出来的对象,只要你不delete,该对象就不会销毁,也就不会调用析构函数。

调试后发现,直接声明出来的 用的是栈区,new出来的 用的是堆。

另外,全局对象或static局部对象,他们是存储在静态存储区。

 

另外附上问答链接:

小甲鱼C++视频的一个问题,关于析构函数
http://bbs.fishc.com/thread-34066-1-1.html

 

 

 

posted @ 2013-07-14 11:53  二维码SJ  阅读(510)  评论(0)    收藏  举报