复制构造函数c ++奇怪的行为?

时间:2012-03-17 10:42:18

标签: c++ deep-copy shallow-copy

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

但在主要方面,我创建了类的实例:

myClass myClass1;

然后做:

myClass1 = myClass2;

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

MyClass1.sort();

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

我已经阅读了浅层和深层拷贝,但是我无法理解为什么在浅层拷贝之后调用的方法会导致它们都被排序?这是预期的行为吗?

更多信息:

在我的班级中,我只是将数组定义为:

static string myArray[5];

然后在一个write方法中我写了5个元素,有没有更好的方法,我必须使用一个方法初始化它。

2 个答案:

答案 0 :(得分: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); }

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

答案 1 :(得分:2)

  

在我的班级中,我只是将数组定义为:

static string myArray[5];
     

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

如果您声明类定义的外部,它将是一个全局变量。 只有一个实例。您需要在类中声明它,并且 not static

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

无论如何,通过咨询a good C++ introductory book可以更好地回答这种基本问题。