C++ C+中的错误+;重载运算符时的代码
我试图在我的代码中重载“+”和“=”运算符,但在使用VS2012运行时,我不断遇到运行时错误,程序崩溃,但在borland C 3.1中运行得非常完美 这是我的密码:C++ C+中的错误+;重载运算符时的代码,c++,class,operator-overloading,operator-keyword,C++,Class,Operator Overloading,Operator Keyword,我试图在我的代码中重载“+”和“=”运算符,但在使用VS2012运行时,我不断遇到运行时错误,程序崩溃,但在borland C 3.1中运行得非常完美 这是我的密码: class employee{ int eid; long esalary; char * ename; static char company_name[20]; static int emp_count; public: static char * getcompan
class employee{
int eid;
long esalary;
char * ename;
static char company_name[20];
static int emp_count;
public:
static char * getcompanyname(){
return company_name;
}
static int getempcount(){
return emp_count;
}
void set(int empid);
void set(long empsalary);
void set(char empname[]);
int getid();
long getsalary();
char * getname();
employee(int empid=0,long empsalary=0,char empname[]="NA"){
eid=empid;
esalary=empsalary;
ename=new char[strlen(empname)+1];
strcpy(ename,empname);
emp_count++;
}
employee(employee &ref){
eid=ref.eid;
esalary=ref.esalary;
ename=new char(strlen(ref.ename)+1);
strcpy(ename,ref.ename);
}
~employee(){
delete(ename);
}
employee operator+(employee &ref){
employee temp(*this);
temp.esalary=esalary+ref.esalary;
return(temp);
}
employee& operator= (employee &ref){
eid=ref.eid;
esalary=ref.esalary;
return * this;
}
}e1,e2,emp;
然后大体上:
emp=e1+e2;
老实说,你的代码是无效的。它甚至不应该编译,因为它违反了引用绑定规则:
+
操作符返回一个临时对象,该对象不能通过非常量引用传递给=
操作符。如果您成功地编译了这段代码,这仅仅意味着您的编译器接受它作为语言的“扩展”
要修复该特定错误,必须在声明中添加一组const
限定符
employee operator +(const employee &ref) const {
employee temp(*this);
temp.esalary = esalary + ref.esalary;
return temp;
}
employee& operator =(const employee &ref){
eid = ref.eid;
esalary = ref.esalary;
return *this;
}
<>这将使你的代码从C++的角度有效,但是它可能无法修复崩溃,因为崩溃的原因肯定在别处。
这是导致崩溃的错误:在复制构造函数中,您这样做了
ename=new char(strlen(ref.ename)+1);
当您使用new
分配数组时,必须使用[]
括号,而不是()
您在第一个构造函数中正确地执行了该操作,但由于某种原因,您在副本构造函数中使用了()
而不是[]
()
在这个上下文中意味着完全不同的东西:它分配一个字符
,并将其初始化为strlen(ref.ename)+1
值
顺便问一下,您不在复制分配操作符中复制ename
有什么原因吗
另外,使用new[]
分配的内存必须通过delete[]
释放。不是使用delete
,而是使用delete[]
。这就是析构函数的外观
~employee() {
delete[] ename;
}
最后,您最好使用
std::string
来存储ename
,而不是依赖原始内存管理。(除非特别要求您这样做)。老实说,您的代码无效。它甚至不应该编译,因为它违反了引用绑定规则:+
操作符返回一个临时对象,该对象不能通过非常量引用传递给=
操作符。如果您成功地编译了这段代码,这仅仅意味着您的编译器接受它作为语言的“扩展”
要修复该特定错误,必须在声明中添加一组const
限定符
employee operator +(const employee &ref) const {
employee temp(*this);
temp.esalary = esalary + ref.esalary;
return temp;
}
employee& operator =(const employee &ref){
eid = ref.eid;
esalary = ref.esalary;
return *this;
}
<>这将使你的代码从C++的角度有效,但是它可能无法修复崩溃,因为崩溃的原因肯定在别处。
这是导致崩溃的错误:在复制构造函数中,您这样做了
ename=new char(strlen(ref.ename)+1);
当您使用new
分配数组时,必须使用[]
括号,而不是()
您在第一个构造函数中正确地执行了该操作,但由于某种原因,您在副本构造函数中使用了()
而不是[]
()
在这个上下文中意味着完全不同的东西:它分配一个字符
,并将其初始化为strlen(ref.ename)+1
值
顺便问一下,您不在复制分配操作符中复制ename
有什么原因吗
另外,使用new[]
分配的内存必须通过delete[]
释放。不是使用delete
,而是使用delete[]
。这就是析构函数的外观
~employee() {
delete[] ename;
}
最后,您最好使用
std::string
来存储ename
,而不是依赖原始内存管理。(除非特别要求您这样做)。请发布VS2012的运行时错误信息。另外,请考虑修改题目的标题,以更具体的方式来反映问题的答案。你在课堂上超载了吗?最后一行是在哪里生成的呢?PS:实现是在类中定义的……最后一行在主函数中,operator[]
是如何重载的?也许如果您再给我们看一点代码,例如,e[]来自哪里?Borland C,你在DOS中跑步吗?在这种情况下,您可能不会发生崩溃,只是在超出分配内存的情况下出现了奇怪的行为。如果e[]有三个元素,则e[3]无效!请发布VS2012的运行时错误信息。另外,请考虑修改题目的标题,以更具体的方式来反映问题的答案。你在课堂上超载了吗?最后一行是在哪里生成的呢?PS:实现是在类中定义的……最后一行在主函数中,operator[]
是如何重载的?也许如果您再给我们看一点代码,例如,e[]来自哪里?Borland C,你在DOS中跑步吗?在这种情况下,您可能不会发生崩溃,只是在超出分配内存的情况下出现了奇怪的行为。如果e[]有三个元素,则e[3]无效!我复制了EnMeNe,但我删除它,因为我认为它是错误源……抱歉,但是STD::String?@ Mazen:<代码> STD::String 是C++标准库提供的类。它用于存储字符串值。它负责内部的所有内存管理,这样您就不必自己做了。我复制了EnMeNe,但我删除它,因为我认为它是错误源……抱歉,STD::String?@ Mazen:<代码> STD::String 是C++标准库提供的类。它用于存储字符串值。它在内部负责所有的内存管理,因此您不必自己做。