首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制构造函数c++奇怪的行为?

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

Stack Overflow用户
提问于 2012-03-17 18:42:18
回答 2查看 149关注 0票数 2

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

但在主要情况下,我创建了一个类的实例,如下所示:

代码语言:javascript
复制
myClass myClass1;

然后执行以下操作:

代码语言:javascript
复制
myClass1 = myClass2;

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

代码语言:javascript
复制
MyClass1.sort();

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

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

更多信息:

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

代码语言:javascript
复制
static string myArray[5];

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-17 19:04:39

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

静态字符串myArray5;

我是否应该在头文件中声明它,因为它只在cpp文件中声明?因为它还在复制这两个。

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

代码语言:javascript
复制
class MyClass1 {
    // other things...
    string myArray[5];
};

在任何情况下,咨询a good C++ introductory book都能更好地回答这种基本问题。

票数 2
EN

Stack Overflow用户

发布于 2012-03-17 18:54:26

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

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

代码语言:javascript
复制
class myclass {
    char text[256];
}

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

代码语言:javascript
复制
class myclass {
    char *text;
    myclass() : text(new char[256]) {}
    ~myclass() { delete [] text; }
}

定义为static的成员永远不会被复制。所有实例都共享它,不需要额外的代码:

代码语言:javascript
复制
class myclass {
    static char text[256];
}

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

代码语言:javascript
复制
myclass(const myclass &base) : text(new char[256]) { strcpy(text, base.text); }

一般经验法则:我是否使用任何被赋予某个new返回值的指针成员?如果是这样的话,编写一个复制构造函数。如果没有,就使用默认的(除非你有其他原因)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9749314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档