关于对象赋值和内存的问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 08:47:44
程序:(劳您辛苦)
#include <iostream.h>
#include <string.h>
class student
{
public:
student(int s_num=0,char *s_name="\0")
{
int len;
number=s_num;
len=strlen(s_name);
name=new char[len+1];
strcpy(name,s_name);
}

friend void s_sort(student *s_stu,int n);
friend void s_input_score(student *s_stu);
void display();
private:
int number;
char *name;
float score_cpp;
};
void s_input_score(student *s_stu)
{
int i;
cout<<"please input everyone's cpp score:"<<endl;
for(i=0;i<5;i++)
cin>>s_stu[i].score_cpp;
}
void s_sort(student *s_stu,int n)
{
int i,j;
student temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(s_stu[i].score_cpp>s_stu[j].score_cpp)
{
temp=s_stu[i];s_stu[i]=s_stu[j];s_stu[j]=temp;
}
}

你的
class student
{
int number;
char *name;
float score_cpp;
};
大小是编译时就已经确定了的。
name指向一个天知道的堆上的内存地址,这个地址上有啥东西,你的student 一点都不知道。
sort的时候 , “=”只是交换了两个student 的 name 指针,所指的内容没有变。其实你把name 指针,看作一个int 变量就能理解了。

by the way
要是你要在析构函数里面写delete
那么相应的 operator = , student(student &)都要补完。

1、楼主的程序存在内存泄露;
2、楼主的分析“对象之间的“=”运算是不是只传递了指针 而并没有将各数据进行拷贝”是正确的。
3、如果需要交换类对象变量,建议楼主增加一个类方法来实现。另外,补充该类的析构函数。比如:
class student
{
...
~student()
{
if (name != (char *)NULL)
{
delete name;
name = (char *)NULL;
}
}
friend void swap(student *p1, student *p2)
{
int number;
char *name;
float score_cpp;
number = p1->number;
name = p1->name;
score_cpp = p1->score_cpp;
p1->number = p2->number;