【问题标题】:Copy constructor c++ weird behavoir?复制构造函数 C++ 奇怪的行为?
【发布时间】:2012-03-17 10:42:17
【问题描述】:

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

但我主要创建了一个类的实例,例如:

myClass myClass1;

然后做:

myClass1 = myClass2;

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

MyClass1.sort();

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

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

更多信息:

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

static string myArray[5];

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

【问题讨论】:

  • 你确定涉及到一个数组?你不是confusing arrays with pointers吗?如果您可以发布一个演示此行为的小示例,将会有所帮助。
  • 给我更多代码。我怎么知道你没有在其他地方搞砸?
  • 我会用更多的代码更新我的帖子,但我不想发布太多,因为它是一个任务,我只是想弄清楚为什么会发生这种情况!虽然我知道这意味着我必须发布更多代码!
  • 该代码无关紧要。向我们发布类定义。
  • 如果您将某事声明为static,它会在类的所有个实例之间共享。

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


【解决方案1】:

您的数组是如何定义/创建的?如果您使用 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 返回值的指针成员?如果是这样,请编写一个复制构造函数。如果没有,请使用他的默认值(除非您有其他原因)。

【讨论】:

  • 我的数组是这样定义的:static string myArray[5];
  • 类的所有实例之间共享一个静态成员。如果您希望每个实例都有自己的副本,请删除 static 关键字。
【解决方案2】:

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

static string myArray[5];

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

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

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

无论如何,这种基本问题最好咨询a good C++ introductory book

【讨论】:

  • 我应该在标题中声明它,因为它只在 cpp 文件中声明吗?因为它仍在复制两者。
  • 什么?您应该在类内部声明它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多