我有一个类(那些读过 Accelerated C++ 的人可能会觉得这个类很熟悉)定义如下:
class Student_info{
public:
Student_info() : midterm(0.0), final(0.0) {};
Student_info(std::istream& is){read(is);};
Student_info(const Student_info& s);
~Student_info();
Student_info& operator=(const Student_info& s);
//Getters, setters, and other member functions ommited for brevity
static int assignCount;
static int copyCount;
static int destroyCount;
private:
std::string name;
double midterm;
double final;
double finalGrade;
std::vector<double> homework;
};
typedef std::vector<Student_info> stuContainer;
bool compare(const Student_info& x, const Student_info& y);
函数calculator() 使用这种类型的对象。作为函数的一部分,使用库的通用排序函数对(已声明的)Student_info 对象的向量进行排序。我的程序没有超过这一点(尽管根据 NetBeans 没有抛出异常并且程序正确退出)。
sort 函数大量使用容器中保存的任何类型的赋值运算符,但我似乎无法找出我定义的那个有什么问题(程序在我定义之前运行正常)。根据Accelerated C++(或者至少我是这样解释的),赋值运算符应该工作的正确方式是首先破坏左操作数,然后用等于右操作数的值再次构造它。所以这是我重载的 operator= 定义:
Student_info& Student_info::operator=(const Student_info& s)
{
if(this != &s)
{
this->~Student_info();
destroyCount++;
*this = s;
}
return *this;
}
如您所见,它调用了 Student_info 复制构造函数,定义如下:
Student_info::Student_info(const Student_info& s)
{
name = s.name;
midterm = s.midterm;
final = s.final;
finalGrade = s.finalGrade;
homework = s.homework;
copyCount++;
}
复制构造函数正确运行,因为省略排序语句允许程序正确运行并产生大于 0 的 copyCount(仅在复制构造函数和 operator= 中修改)。
那么我的赋值运算符到底有什么问题?它与调用 Student_info 对象的破坏有关,但我不知道如何纠正它而不是破坏它。
(顺便说一句,Accelerated C++ 中的一个练习要求创建复制构造函数、析构函数和赋值运算符……我意识到这些函数的合成版本显然足以满足我的课程)