| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1252 人关注过本帖
标题:析构函数结果无法输出?
只看楼主 加入收藏
sdg430
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2010-5-17
结帖率:66.67%
收藏
 问题点数:0 回复次数:6 
析构函数结果无法输出?
#include <iostream>
#include <string>
using namespace std;

class newb
{
public:
    newb()
    {
        cout<<"woshi"<<endl;
    }
    newb(string pname)
    {
        name=pname;
        cout<<"zhegeshi"<<name<<endl;
    }
   

    void display()
    {
        cout<<"display a name"<<name<<endl;
    }
    ~newb();
   
protected:
    string name;
};
newb::~newb()
{
   
            cout<<"dest"<<endl;
   
}
void main()
{
    newb obj1;
    newb obj2("jenny");
    obj1.display();
    obj2.display();
    getchar();
   
}
运行后结果为
woshi
zhegeshijenny
display a name
display a namejenny


为何无法输出析构函数中的cout内容,麻烦各位了,我主要是想看是main中每执行一次就调用一次析构函数,还是执行到 obj2.display();最后就执行一次析构函数,对象超出其作用范围后自动执行,对这个作用范围还不是很理解!




[ 本帖最后由 sdg430 于 2010-7-1 15:55 编辑 ]
搜索更多相关主题的帖子: woshi 
2010-07-01 15:40
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
void fun()
{
    newb obj1;
    newb obj2("jenny");
    obj1.display();
    obj2.display();
}
int main()
{
    fun();//这样你就能看到了。fun()执行完了,在它里面创建的对像就会被销毁。
    getchar();
    return 0;
}

迭代的是人,递归的是神。
2010-07-01 15:50
sdg430
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2010-5-17
收藏
得分:0 
回复 2楼 lintaoyn
我是想对这个题目来说明问题,不把他们放在一个FUN()中,析构函数也是要执行的,针对我这个题我想看看他的输出到底是什么,还有就是对象作用范围这个不太理解!、

不过刚才我把析构函数拿出去定义,在里面只写个原型,在上面我写的输出后显示了两行
woshi
zhegeshijenny
display a name
display a namejenny
dest
dest
这说明析构函数执行了两次,这怎么会执行两次呢?麻烦告知下
用您的方法执行后显示
woshi
zhegeshijenny
display a name
display a namejenny
dest
dest
为什么会执行两次析构函数呢!这个不理解,麻烦您了!


[ 本帖最后由 sdg430 于 2010-7-1 16:12 编辑 ]
2010-07-01 16:00
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
因为有两个newb的实例。 newb obj1; newb obj2("jenny");

迭代的是人,递归的是神。
2010-07-01 17:23
rainbow1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:277
专家分:839
注 册:2010-5-19
收藏
得分:0 
没有问题呀。是析构两次的。
析构两次是因为创建了两个实例对象,在程序退出时要对两个实例析构。
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 rainbow1 于 2010-7-1 18:00 编辑 ]
2010-07-01 17:58
sdg430
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2010-5-17
收藏
得分:0 
回复 5楼 rainbow1
结果确实是这样,两个实例析构两次,当执行到obj1.display()后这时实例obj1不是已经执行完毕了吗,这时对象obj1不是也已经超出其作用范围了吗,应执行一次析构函数,然后当执行obj2.display时再执行一次析构函数,所以我理解输出应该为
woshi
zhegeshijenny
display a name
dest
display a namejenny
dest


自己还是没有在这个作用范围上理解清楚,我认为obj1就是一个对象,执行完obj1.display()后就超出其作用范围,就应该立马执行析构函数,而后在执行obj2.display()


[ 本帖最后由 sdg430 于 2010-7-1 20:14 编辑 ]
2010-07-01 20:12
rainbow1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:277
专家分:839
注 册:2010-5-19
收藏
得分:0 
obj1.display()运行完时,obj1对象并没有删除,所以不会运行析构函数。只有当程序最后退出的时候,再依次删除对象,运行析构函数。

[ 本帖最后由 rainbow1 于 2010-7-2 13:03 编辑 ]
2010-07-01 21:08
快速回复:析构函数结果无法输出?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024374 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved