| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 842 人关注过本帖
标题:请问为何此程序会出现两次析构函数调用~谢谢大家!
只看楼主 加入收藏
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
结帖率:90.24%
收藏
已结贴  问题点数:20 回复次数:11 
请问为何此程序会出现两次析构函数调用~谢谢大家!
#include<iostream>
#include<string>
using namespace std;

class Student
{
public:
    Student::Student(string a,int b,float c);
    Student();
    ~Student();
    void show();

private:
    string name;
    int num;
    float grade;
};

Student::Student()
{
    cout<<num<<"_默认构造函数"<<endl;
}

Student::~Student()
{
    cout<<num<<"_析构函数"<<endl;
}

void Student::show()
{
    cout<<"学生信息为:"<<endl;
    cout<<name<<"_"<<num<<"_"<<grade<<endl;
}

Student::Student(string a,int b,float c):name(a),num(b),grade(c){ cout<<num<<"_带参数的构造函数!"<<endl; };

int main()
{
//    Student stu[3]={Student("Amos",1022,98.5),Student("Vivien",1021,95.5),Student("Leon",1023,91.5)};

//    stu[0].show();
//    stu[1].show();
//    stu[2].show();

    Student A =Student("Amos",1022,98.5);
    Student B =Student("Vivien",1021,95.5);
    Student C =Student("Leon",1023,91.5);
    A.show();
    B.show();
    C.show();

}
搜索更多相关主题的帖子: private 信息 public include 
2015-09-20 16:33
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
运行程序大家会发现。。。调用了两次析构函数~  I dont know why ~

既然还有不甘心
就还没到放弃的时候~
2015-09-20 16:39
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
应该是三个吧,每个对象用完后都会析构

一片落叶掉进了回忆的流年。
2015-09-20 17:40
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
回复 3楼 诸葛欧阳
确实是三个析构函数。。。但是每个对象析构啦两次、、、、不知为何?

既然还有不甘心
就还没到放弃的时候~
2015-09-21 10:21
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
去C++问吧

总有那身价贱的人给作业贴回复完整的代码
2015-09-21 10:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
换个编译器试试
按照 C++标准,即使存在自定义的拷贝构造函数,此时也不会去调用拷贝构造函数。

对于古老的C++标准,Student A =Student("Amos",1022,98.5) 分成两步
第一步,用 "Amos",1022,98.5 构造了一个匿名的临时Student对象
第二步,用这个匿名的临时Student对象 进行拷贝构造A
当然了,上述是非常非常古老的C++标准,现在的是(早就是了,这不是C++11的新规定)
a. 即使自定义拷贝构造函数(比如里面输出一段文件),也不会去调用拷贝构造
b. 虽然不会调用拷贝构造,但任受拷贝构造的权限控制(比如 拷贝构造若是private的,则编译失败)
2015-09-21 10:52
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
回复 6楼 rjsp
我这个用的是VC++6.0确实太老啦~  打算换个编译工具啦  谢谢版主~

既然还有不甘心
就还没到放弃的时候~
2015-09-21 20:09
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
回复 6楼 rjsp
//版主,你好!我按照你的建议更新了C语言编译器现在换了VS2010,两次析构的问题得到了解决但又遇到了新的问题!
#include<iostream>
#include<string>
using namespace std;

class Student
{
public:
    Student::Student(string a,int b,float c);
    Student();
    ~Student();
    void show();

private:
    string name;
    int num;
    float grade;
};

Student::Student()
{
    cout<<num<<"_默认构造函数"<<endl;
}

Student::~Student()
{
    cout<<num<<"_析构函数"<<endl;
}

void Student::show()
{
    cout<<"学生信息为:"<<endl;
    cout<<name<<"_"<<num<<"_"<<grade<<endl;
}

Student::Student(string a,int b,float c):name(a),num(b),grade(c){ cout<<num<<"_带参数的构造函数!"<<endl; };

int main()
{
  //  Student stu[3]={Student("Amos",1022,98.5),Student("Vivien",1021,95.5),Student("Leon",1023,91.5)};


   Student A =Student("Amos",1022,98.5);
   Student B =Student("Vivien",1021,95.5);
   Student C =Student("Leon",1023,91.5);
    A.show();
    B.show();
    C.show();

    getchar();

}

//以本程序为例~运行结果为
/*    1022_带参构造
      1022_析构
      1021_带参构造
      1021_析构
      1020_带参构造
      1020_析构
      输出学生信息1022
      输出学生信息1021
      输出学生信息1020
*/

但是按照我的理解:输出结果应该是:
/*    1022_带参构造
      1021_带参构造
      1020_带参构造
     
      输出学生信息1022
      输出学生信息1021
      输出学生信息1020

     1020_析构
     1021_析构
     1022_析构
*/


//希望版主能解释一下!请问是不是编译器的bug?

既然还有不甘心
就还没到放弃的时候~
2015-09-22 09:52
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
1022_带参数的构造函数!
1021_带参数的构造函数!
1023_带参数的构造函数!
学生信息为:
Amos_1022_98.5
学生信息为:
Vivien_1021_95.5
学生信息为:
Leon_1023_91.5

1023_析构函数
1021_析构函数
1022_析构函数

--------------------------------
Process exited with return value 0
Press any key to continue . . .
我的编译器。。。

剑栈风樯各苦辛,别时冰雪到时春
2015-09-22 10:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 8楼 S140131022
没事你加个 getchar(); 干什么呀?去掉它,你会发现“两次析构的问题还没解决”,这应该是VC的bug。
没办法,要么你换个编译器,要么你将 Student A =Student("Amos",1022,98.5); 改为 Student A( "Amos", 1022, 98.5 );

没查到相应的bug报告,有点儿奇怪,我再想想是哪里出问题了


[ 本帖最后由 rjsp 于 2015-9-22 10:37 编辑 ]
2015-09-22 10:25
快速回复:请问为何此程序会出现两次析构函数调用~谢谢大家!
数据加载中...
 
   



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

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