鱼C论坛

 找回密码
 立即注册
查看: 5135|回复: 10

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

[复制链接]
发表于 2013-7-13 22:13:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Sì曾相識♂ 于 2013-7-13 22:17 编辑

刚在看小甲鱼C++视频的第十五讲:不是每滴牛奶都叫特仑苏(构造器和析构函数讲解)

先上代码,然后来说下我的不解:
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>

  4. class StoreQuote
  5. {
  6. public:
  7.         std::string quote, speaker;
  8.         std::ofstream fileOutput;
  9.         
  10.         StoreQuote();
  11.         ~StoreQuote();
  12.         
  13.         void inputQuote();
  14.         void inputSpeaker();
  15.         bool write();        
  16. };

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

  21. StoreQuote::~StoreQuote()
  22. {
  23.         fileOutput.close();
  24. }

  25. void StoreQuote::inputQuote()
  26. {
  27.         std::getline(std::cin, quote);
  28. }

  29. void StoreQuote::inputSpeaker()
  30. {
  31.         std::getline(std::cin, speaker);
  32. }

  33. bool StoreQuote::write()
  34. {
  35.         if( fileOutput.is_open() )
  36.         {
  37.                 fileOutput << quote << "|" << speaker << "\n";
  38.                 return true;
  39.         }
  40.         else
  41.         {
  42.                 return false;
  43.         }
  44. }

  45. int main()
  46. {
  47.         StoreQuote quote;
  48.         
  49.         std::cout << "请输入一句名言:\n";
  50.         quote.inputQuote();
  51.         
  52.         std::cout << "请输入作者:\n";
  53.         quote.inputSpeaker();
  54.         
  55.         if( quote.write() )
  56.         {
  57.                 std::cout << "成功写入文件^_^";
  58.         }
  59.         else
  60.         {
  61.                 std::cout << "写入文件失败T_T";
  62.                 return 1;
  63.         }
  64.         
  65.         return 0;
  66. }
复制代码
从以上的代码可以看出,小甲鱼虽然有给析构函数 添加实现代码,但是在main函数中并没有调用析构函数。
于是我的不解就来了,难道析构函数跟构造函数一样会自己自动调用?如果自己自动调用的话,那又是何时去调用呢?系统如何判断什么时候该调用呢???
本人C++菜鸟,还请各位大神指点一二。
另外在简单的问一句,现在C++视频的课后习题答案在哪里??论坛改版了,找不到了....:'(

PS:小甲鱼的最后附图不错(并不是每滴牛奶都叫特仑苏那张....):lol

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-13 23:48:29 | 显示全部楼层

回帖奖励 +10 鱼币

对象生命周期结束的时候将自动调用析构函数。你的例子里,就是局部对象quote在main函数结束的时候自动调用析构函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-13 23:49:37 | 显示全部楼层
析构函数也可以自己主动调用,但是这不是常规的做法。在你真的成为高手之前不要这么做。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-14 10:22:57 | 显示全部楼层

谢谢 版主,了解了。
那就是说,在编译器编译链接的过程中就把析构函数的汇编代码写进了exe?
编译器帮你判断了哪里是你的局部对象结束的位置?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-14 10:31:13 | 显示全部楼层
Sì曾相識♂ 发表于 2013-7-14 10:22
谢谢 版主,了解了。
那就是说,在编译器编译链接的过程中就把析构函数的汇编代码写进了exe?
编译器帮你 ...

基本是这样的,但有个例外,就是动态new出来的对象,只要你不delete,该对象就不会销毁,也就不会调用西沟函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-14 10:39:57 | 显示全部楼层
仰望天上的光 发表于 2013-7-14 10:31
基本是这样的,但有个例外,就是动态new出来的对象,只要你不delete,该对象就不会销毁,也就不会调用西沟 ...

我用OD调试了一下发现,直接声明出来的 用的是栈区,new出来的 用的是堆。 不知道我调试的对不对....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-14 10:43:25 | 显示全部楼层
Sì曾相識♂ 发表于 2013-7-14 10:39
我用OD调试了一下发现,直接声明出来的 用的是栈区,new出来的 用的是堆。 不知道我调试的对不对....

你的调试没有问题。此外你还可以试验下全局对象或static局部对象,他们是存储在静态存储区
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-14 10:53:16 | 显示全部楼层
仰望天上的光 发表于 2013-7-14 10:43
你的调试没有问题。此外你还可以试验下全局对象或static局部对象,他们是存储在静态存储区

谢谢版主指导:handshake
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-8 22:22:04 | 显示全部楼层
仰望天上的光 发表于 2013-7-14 10:43
你的调试没有问题。此外你还可以试验下全局对象或static局部对象,他们是存储在静态存储区

问个问题。小甲鱼这个程序,第一个输入名言
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-8 22:30:59 | 显示全部楼层
仰望天上的光 发表于 2013-7-14 10:43
你的调试没有问题。此外你还可以试验下全局对象或static局部对象,他们是存储在静态存储区

用getline函数,但是我输入的是字符串,他是按回车结束,也就是回车没有被getline接受,而被字符串接受了。我第一次要按2次回车才可以,这是为什么呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-8 22:35:40 | 显示全部楼层
这是为什么那,我把你的代码直接copy过来的 122.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 03:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表