C ++ Copy Constructor和=运算符重载

时间:2013-11-11 18:36:28

标签: c++ operator-overloading destructor copy-constructor

我试图在C ++中了解复制构造函数,运算符重载和析构函数。给定一个包含指向它自己类型的指针的类,如何编写复制构造函数或=运算符重载?我尝试了以下方法,但在main中声明或分配Test对象时,我一直遇到分段错误。有谁能解释我做错了什么?

class Test {
public:
    Test(string name);
    Test(const Test& testObject);
    Test& operator=(const Test& rhs);
    ~Test();
    string getName();
    void setName(string newname);
    Test* getNeighbor(int direction);
    void setNeighbor(Test* newTest, int direction);
private:
    string name;
    Test* neighbors[4];
};    

Test::Test() {
    name = "*";
    neighbors[4] = new Test[4];
}

Test::Test(const Test& testObject) {
    this->name = testObject.name;
    for (int i = 0; i < 4; i++) {
        this->neighbors[i] = testObject.neighbors[i];
    }
}

Test& Test::operator=(const Test& rhs) {
    if (this == &rhs) {
        return *this;
    }
    else {
        name = rhs.name;
        delete [] neighbors;
        for (int i = 0; i < 4; i++) {
            neighbors[i] = rhs.neighbors[i];
        }
        return *this;
    }
}

1 个答案:

答案 0 :(得分:0)

您不应删除neighbors,因为它是静态数组。而是依次删除每个元素。如果它们归当前对象所有,也只删除它们(这在您的代码中并不明显)。

我将创建一个帮助私有函数destroy并在赋值运算符和析构函数中重用它以避免代码重复。