shenqidewuya

在C++中对于任何一个类,如果没有用户自定义的赋值运算符函数,系统会自动地为其生成默认的赋值运算函数,以完成数据成员之间的逐位复制。通常情况下,系统默认的赋值函数可以完成赋值任务,但在某些特殊情况下,如类中有指针类形式,就不能进行直接相互赋值,否则就会产生指针悬挂问题!

例如:

class Student

{

private:

  char *name;

  int score;

public:

  Student(char *na,int s);

  ~Student();

  void print();

};

#include"iostream"

#include"iomanip"

using namespace std;

#include"student.h"

 

int main()

{

  Student p1("zhang",90);

  Student p2("wang",80);

  p2 = p1;

  cout<<"p2:";

  p2.print();

  return 0;

}

Student::Student(char *na,int s)

{

  name = new char[strlen(na) + 1];

  strcpy(name,na);

  score = s;

}

 

Student::~Student()

{

  delete name;

}

void Student::print()

{

  cout<<name<<setw(5)<<score<<endl;

}

程序将显示运行结果出错的信息

原因:

p2生命周期结束后,p1的指针所指的空间就不存在了,产生指针悬挂

解决的方法是:重载赋值运算符解决指针悬挂问题

class Student
{
private:
 char *name;
 int score;
public:
 Student(char *na,int s);
 Student &operator =(const Student &);
 ~Student();
 void print();
};

#include"iomanip"
#include"iostream"
using namespace std;
#include"string.h"
#include"student.h"

int main()
{
 Student p1("zhang",90);
 Student p2("wang",80);
 cout<<"              p2:     ";
 p2.print();
 p2 = p1;
 cout<<"修改后p2:      ";
 p2.print();
 return 0;
}

Student::Student(char *na, int s)
{
 name = new char[strlen(na) + 1];
 strcpy(name,na);
 score = s;
}

Student &Student::operator =(const Student &p)                                 //定义赋值运算符重载
{
 if(this == &p)
  return *this;
 delete name;                  //释放掉原空间
 name = new char[strlen(p.name) + 1];            //分配新空间
 strcpy(name,p.name);
 return *this;
}

Student::~Student() 
{
 delete name;
}

void Student::print()
{
 cout<<name<<setw(5)<<score<<endl;
}

 

分类:

技术点:

相关文章: