簡體   English   中英

C ++復制構造函數和運算符重載

[英]C++ Copy Constructor & Operator Overloading

我對類比較陌生,上周被介紹來復制構造函數和重載。 我應該重載=運算符,並使用它使用類名來分配多個變量。

由於某種原因,運行程序會導致彈出窗口

program.cpp已停止響應。

我很肯定,由於我是C ++對象的菜鳥,所以我缺少一些次要/主要的事情。

任何建議都非常感謝!

#include<iostream>
#include<string>

using namespace std;

class Employee
{
private:
    char *name;
    string ID;
    double salary;
public:
    Employee() {}
    Employee(char *name, string eid, double salary) {}

    Employee(const Employee &obj)
    {
        name = new char;
        ID = obj.ID;
        salary = obj.salary;
    }

    ~Employee() {}

    void setName(char *n)
    {
        name = n;

    }

    void setID(string i)
    {
        ID = i;
    }

    void setSalary(double s)
    {
        salary = s;
    }

    char getName()
    {
        return *name;
    }

    string getID()
    {
        return ID;
    }

    double getSalary()
    {
        return salary;
    }

    Employee operator = (Employee &right)
    {
        delete[] name;
        ID = right.ID;
        salary = right.salary;
        return *this;
    }

};

int main()
{
    Employee e1("John", "e222", 60000), e2(e1), e3, e4;

    e3 = e4 = e2;

    e2.setName("Michael");
    e2.setSalary(75000);
    e3.setName("Aaron");
    e3.setSalary(63000);
    e4.setName("Peter");


    cout << "\nName: " << e1.getName() << "\nID: " << e1.getID() <<     "\nSalary: " << e1.getSalary() << endl;
    cout << "\nName: " << e2.getName() << "\nID: " << e2.getID() <<     "\nSalary: " << e2.getSalary() << endl;
    cout << "\nName: " << e3.getName() << "\nID: " << e3.getID() <<     "\nSalary: " << e3.getSalary() << endl;
    cout << "\nName: " << e4.getName() << "\nID: " << e4.getID() <<     "\nSalary: " << e4.getSalary() << endl;

    return 0;
}

此代碼存在多個問題。

第一個問題是在構造函數Employee(char *name, string eid, double salary) {} ,它什么都不做並且忽略了傳遞的數據,而應該使用它來初始化字段(類成員數據)。

Employee(char *name, string eid, double salary) 
{
    const size_t bufferSize = strlen(name) + 1; 
    this->name = new char[bufferSize];
    memcpy(this->name, name, bufferSize);

    this->ID = eid;
    this->salary = salary; 
}

第二個問題是在復制構造函數Employee(const Employee &obj) ,您只是在初始化name (使用char的單個字節),僅此而已。 復制構造函數應該做的是使用傳遞給它的類對象的字段初始化類的字段(類成員)。

Employee(const Employee &obj)
{
    const size_t bufferSize = strlen(name) + 1; 
    this->name = new char[bufferSize];
    memcpy(this->name, name, bufferSize);
    ID = obj.ID;
    salary = obj.salary;
}

第三個問題是默認構造函數,它假定使用NULL初始化name指針,以便析構函數可以很好地清除它:

Employee() : name(NULL) {}

~Employee() 
{
    if (NULL != name)
        delete[] name;
}

第四個也是最后一個問題是賦值運算符,該賦值運算符應該正確地初始化name成員數據而不是將其刪除(這沒有意義)

Employee operator = (Employee &right)
{
    if (NULL != this->name)
        delete[] this->name;

    const size_t bufferSize = strlen(right.name) + 1; 
    this->name = new char[bufferSize];
    memcpy(this->name, right.name, bufferSize);
    ID = right.ID;
    salary = right.salary;
    return *this;
}

問題是這一行:

        delete[] name;

您不應該刪除未分配的任何東西,並且要先分配new東西。 如果刪除上述行,則表明您的程序有效。 :)

這是您的程序的稍作修訂的版本,可以正常工作:

#include<iostream>
#include<string>

using namespace std;

class Employee
{
private:
    char *name;
    string ID;
    double salary;
public:
    Employee() {}
    Employee(char *name, string eid, double salary)
        : name (name) // ADDED THESE
        , ID(eid)
        , salary(salary)
    {

    }

    Employee(const Employee &obj)
    {
        name = obj.name; // WAS: new char;
        ID = obj.ID;
        salary = obj.salary;
    }

    ~Employee() {}

    void setName(char *n)
    {
        name = n;
    }

    void setID(string i)
    {
        ID = i;
    }

    void setSalary(double s)
    {
        salary = s;
    }

    char * getName()
    {
        return name;
    }

    string getID()
    {
        return ID;
    }

    double getSalary()
    {
        return salary;
    }

    Employee operator = (const Employee &right)
    {
        name = right.name; // WAS: delete[] name;
        ID = right.ID;
        salary = right.salary;
        return *this;
    }

};

int main()
{
    Employee e1("John", "e222", 60000), e2(e1), e3, e4;

    e3 = e4 = e2;

    e2.setName("Michael");
    e2.setSalary(75000);
    e3.setName("Aaron");
    e3.setSalary(63000);
    e4.setName("Peter");


    cout << "\nName: " << e1.getName() << "\nID: " << e1.getID() << "\nSalary: " << e1.getSalary() << endl;
    cout << "\nName: " << e2.getName() << "\nID: " << e2.getID() << "\nSalary: " << e2.getSalary() << endl;
    cout << "\nName: " << e3.getName() << "\nID: " << e3.getID() << "\nSalary: " << e3.getSalary() << endl;
    cout << "\nName: " << e4.getName() << "\nID: " << e4.getID() << "\nSalary: " << e4.getSalary() << endl;

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM