c++类的构造与析构,与vector的使用

yangyang_cs 2011-04-12 05:34:45
我新建了一个student类,
有姓名name和分数score以及静态成员变量总分sum和人数count;
这个类有两个构造函数,为了调试,我这两个构造函数都有输出“构造了一个student”;
析构时也会输出析构的学生姓名和分数;

当我用vector<student> list;
用控制台输入姓名和分数,逐个list.push_back;
出现了以下神奇的效果:
/////////////////////////////////////////////
以下是从控制台输入和输出。
////////////////////////////////////////////
构造了一个student
输入第1个名字和分数(分数为负数时结束)
asd 23
sum=23 count=1
平均分数23
总分23
输入第2个名字和分数(分数为负数时结束)
as 45
asd--23
析构了一个student
sum=22 count=0
平均分数1.#INF
总分22
输入第3个名字和分数(分数为负数时结束)
d 34
asd--23
析构了一个student
as--45
析构了一个student
sum=-57 count=-2
平均分数28.5
总分-57
输入第4个名字和分数(分数为负数时结束)
/////////////////////////////////////
为什么会调用析构函数,而且只调用了一次构造函数,却调用了好几次析构函数????
////////////////////////////////////
从控制台输入的部分源代码:
////////////////////////////////////
void typein(vector<student> &list)
{
string name;
double score;
student temp;
int i=1;
while(true)
{
cout<<"输入第"<<i<<"个名字和分数"<<"(分数为负数时结束)"<<endl;
cin>>name>>score;
if(score<0)
break;
temp.set(name,score);
//list.push_back((name,score));
list.push_back(temp);
//studentList[i-1].set(name,score);
cout<<"平均分数"<<student::average()<<endl;
cout<<"总分"<<student::sun()<<endl;
++i;
}
}
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyang_cs 2011-04-19
  • 打赏
  • 举报
回复
是没有写拷贝构造函数的问题
pengzhixi 2011-04-12
  • 打赏
  • 举报
回复
请把拷贝构造函数也添加上就知道了。
pathuang68 2011-04-12
  • 打赏
  • 举报
回复
把vector<student> list;中的list换个名字吧,养成好习惯。

楼主的代码肯定存在逻辑错误,单步调试吧。
wind_breez 2011-04-12
  • 打赏
  • 举报
回复
vector的push_back,最终插入到容器里的实际上是通过拷贝构造构造出来的新的对象,所以肯定有析构了。参加effective stl 条款3.
yangyang_cs 2011-04-12
  • 打赏
  • 举报
回复

//全部源代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
///////////////////////////////////////
///////学生类class student/////////////
///////////////////////////////////////
class student
{
friend void showmax(vector<student>& x);
friend void showmin(vector<student>& x);
private://姓名,分数;
static double sum;
static int count;
string name;
double score;
public:
student();
student(string n,double s);
void set(string n,double s);//更改名字和分数的函数;
void show();//输出名字和分数;
static double average();//返回平均分
static double sun();//返回总分
~student();
};
//静态变量初始化
double student::sum=0;
int student::count=0;
student::student()
{//无参数
cout<<"构造了一个student"<<endl;
name="noname";
score=0;
++count;
sum+=score;
}
student::~student()
{
this->show();
cout<<"析构了一个student"<<endl;
--count;
sum-=score;
}
student::student(string n,double s)
{//有参数
cout<<"构造了一个student"<<endl;
name=n;
score=s;
++count;
sum+=score;
}
void student::set(string n,double s)
{//设置姓名分数
name=n;
sum-=score;
score =s;
sum+=score;
}
void student::show()
{//输出姓名分数

cout<<name<<"--"<<score<<endl;
}
double student::average()
{
cout<<"sum="<<sum<<" "<<"count="<<count<<endl;
return sum/count;
}
double student::sun()
{
return sum;
}
//////////////////////////////////////////
////友元函数showmax,showmin//////////////
/////////////////////////////////////////
void showmax(vector<student>& x)
{//输出分数最高的姓名和分数
int len=x.size();
if(len==0)
{
cout<<"没有数据!!!"<<endl;
return;
}
int i,max=0;//max是记录最高分数的下标
for(i=1;i<len;++i)
{
if(x[max].score<x[i].score)
max=i;
}
cout<<"the max is ";
x[max].show();
}
void showmin(vector<student>& x)
{//输出最低分数的姓名和分数
int len=x.size();
if(len==0)
{//没有数据,则返回
cout<<"没有数据!!!"<<endl;
return;
}
int i,min=0;
for(i=1;i<len;i++)
{
if(x[min].score>x[i].score)
min=i;
}
cout<<"the min is ";
x[min].show();
}
int main()
{
void typein(vector<student> &list);
vector<student> studentList;

typein(studentList);
showmax(studentList);
showmin(studentList);
cout<<"平均分数"<<student::average()<<endl;
cout<<"总分"<<student::sun()<<endl;
system("pause");
return 0;
}
void typein(vector<student> &list)
{
string name;
double score;
student temp;
int i=1;
while(true)
{
cout<<"输入第"<<i<<"个名字和分数"<<"(分数为负数时结束)"<<endl;
cin>>name>>score;
if(score<0)
break;
temp.set(name,score);
//list.push_back((name,score));
list.push_back(temp);
//studentList[i-1].set(name,score);
cout<<"平均分数"<<student::average()<<endl;
cout<<"总分"<<student::sun()<<endl;
++i;
}
}

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧