注册 登录
编程论坛 C++教室

C++里面析构函数的问题!!!

keep_on 发布于 2012-11-17 12:07, 447 次点击
class Stud
{
 char *no;
 char *name;
 double deg;
 static double sum;
 static int num;
    public:
  void setdata(char *,char *,double );
  void disp();
  static double avg();
  ~Stud();
};
/*1. 设计一个学生类Stud,包括学号(no)、姓名(name)、和成绩(deg)数据成员,两个静态变量sum和num,
分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于赋值和输出成员数据,
另有一个静态成员函数avg(),它用于计算平均分。在main()函数中定义一个对象数组用于存储输入的学生数据,
要求输出这些学生数据并计算平均分。*/
#include<iostream.h>
#include"Stud.h"
#include<string.h>
void Stud::setdata(char *x,char *y,double d)
{
 no=new char[strlen(x)+1];
 strcpy(no,x);
 name=new char[strlen(y)+1];
 strcpy(name,y);
 deg=d;
 sum+=deg;
 num++;
}
void Stud::disp()
{
 cout<<no<<'\t'<<name<<'\t'<<deg<<endl;
}
Stud::~Stud()
{
 delete []no;
 delete []name;
}
double Stud::sum=0;
int Stud::num=0;
double Stud::avg()
{
 cout<<"这"<<num<<"个同学的平均分是:"<<sum/num<<endl;
 return sum/num;
}
void main()
{
 int i=0,j;
 Stud a[20];
 char num[30],name[20];
 double score;
 cout<<"请输入学生的学号、姓名和成绩(以'@'结束)。\n";
 while (1)
 {
  cin>>num;
  if (num[0]=='@')
   break;
  cin>>name>>score;
  a[i++].setdata(num,name,score);
 }
 cout<<"  学号"<<'\t'<<"姓名"<<'\t'<<"成绩"<<endl;
 for (j=0;j<i;j++)
  a[j].disp();
 Stud::avg();
}
为什么最后运行的结果还是有问题?而去掉了析构函数就可以了,这是为什么?能不能不去掉析构函数将这个程序运行出来?求高手!!!
5 回复
#2
rjsp2012-11-17 12:36
我先劝你换个老师,从题目上就看出你这个老师水平偏得有多离谱

言归正传,你定义了 Stud a[20];,但如果没全部用到,没用到的那部分的no和name值就是无意义的,在析构时delete[]出错。
加个缺省构造函数
  Stud() : no(0), name(0)
  {
  }
#3
liufashuai2012-11-17 18:03
哥们析构函数怎么那么写,且不说让你加上异常处理了,最起码加上基本判断吧!
程序代码:
Stud::~Stud()
{
     if(no)
        delete []no;
     if(name)
        delete []name;
}

在修改一下试试吧,这不是主要问题
#4
keep_on2012-11-18 09:46
回复 2楼 rjsp
谢谢!!!,我们还是刚学C++,所以学的不是很多,可能那部分老师忘了讲了。
#5
keep_on2012-11-18 09:47
回复 3楼 liufashuai
这个样子我试了,不行,2楼的方法是对的,不过还是谢谢
#6
wcyun_112012-11-18 16:56
我也是菜鸟,213961554 C++交流群一起学习
1