gpt4 book ai didi

c++ - 重载运算符时 C++ 代码出错

转载 作者:行者123 更新时间:2023-11-28 00:51:11 25 4
gpt4 key购买 nike

我试图在我的代码中重载“+”和“=”运算符,但我不断收到运行时错误并且程序在使用 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 * 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;

最佳答案

老实说,您的代码无效。它甚至不应该编译,因为它违反了引用绑定(bind)规则:+ 运算符返回一个临时对象,不能通过非常量引用传递给 = 运算符.如果您设法编译了此代码,则仅表示您的编译器接受它作为语言的“扩展”。

要修复该特定错误,您必须在声明中添加一堆 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分配一个数组时,你必须使用[]括号,而不是()

ename = new char[strlen(ref.ename) + 1];

您在第一个构造函数中正确地完成了它,但是出于某种原因,您在复制构造函数中使用了 () 而不是 []() 在这种情况下意味着完全不同的东西:它分配单个 char 并将其初始化为 strlen(ref.ename) + 1 值。

顺便说一句,您有没有在复制赋值运算符中复制 ename 的原因?

另外,用 new[] 分配的内存必须用 delete[] 释放。不是使用 delete,而是使用 delete[]。这就是你的析构函数的样子

~employee() {
delete[] ename;
}

最后,您最好使用 std::string 来存储 ename,而不是依赖原始内存管理。 (除非特别要求您这样做)。

关于c++ - 重载运算符时 C++ 代码出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com