2

嗨,我有一个包含数组的类,我没有通过我的类构造函数传递它(这里可能会出错吗?)数组只是在类中定义,然后在读取方法中初始化。

但总的来说,我制作了一个类的实例,例如:

myClass myClass1;

然后做:

myClass1 = myClass2;

现在我在第一个类实例上使用冒泡排序方法,例如:

MyClass1.sort();

现在,当我在排序后将这两个实例都写成文本时,它们都被排序了吗?

我读过浅拷贝和深拷贝,但我不明白为什么在浅拷贝之后调用的方法会导致它们都被排序?这是预期的行为吗?

更多信息:

在我的课堂上,我只是将数组定义为:

static string myArray[5];

然后在 write 方法中我将 5 个元素写入它,有没有更好的方法来做到这一点,但我必须使用一种方法来初始化它。

4

2 回答 2

3

您的数组是如何定义/创建的?如果您new使用指针创建并引用它,您将需要自定义复制构造函数来创建深层副本(即创建数组的新实例并复制其内容)。默认的拷贝构造函数只会做一个浅拷贝,所以两个实例将使用相同的内存(即两个指针都指向堆上的同一个数组)。

这将与默认的复制构造函数一起使用:

class myclass {
    char text[256];
}

这不适用于默认的复制构造函数(至少不像预期的那样):

class myclass {
    char *text;
    myclass() : text(new char[256]) {}
    ~myclass() { delete [] text; }
}

定义为的成员static永远不会被复制。所有实例共享它,无需进一步的代码:

class myclass {
    static char text[256];
}

第二种情况的复制构造函数可能如下所示(注意这是简化的,不检查有效值等):

myclass(const myclass &base) : text(new char[256]) { strcpy(text, base.text); }

一般经验法则:我是否使用任何分配了返回值的指针成员 some new?如果是这样,请编写一个复制构造函数。如果没有,请使用他的默认值(除非您有其他原因)。

于 2012-03-17T10:54:25.637 回答
2

在我的课堂上,我只是将数组定义为:

static string myArray[5];

我应该在标题中声明它,因为它只在 cpp 文件中声明吗?因为它仍在复制两者。

如果您在类定义之外声明它将是一个全局变量。它只会有一个实例。您需要在类中声明它,而不是 static

class MyClass1 {
    // other things...
    string myArray[5];
};

无论如何,最好通过查阅一本好的 C++ 入门书来回答这类基本问题。

于 2012-03-17T11:04:39.393 回答