2016-12-04 59 views
0

在我的代码,我试图做一个字符串类(这是一个分配),并具有下列数据的类中的一个对象复制到另一个:C++:</p> <pre><code>private: int strLen; int dataLen; char* data; </code></pre> <p>和构造函数:一个构造函数

myStr(); 
myStr(const myStr&); 
myStr(const char*); 

第三构造函数采用一个字符串数组,分配空间数据并把它复制在,设置的strlen到字符的字符串中的量,并且DATALEN到阵列的大小。第二个构造函数是相似的,但它需要一个完整的对象,并且应该将其复制到构造函数创建的新对象中。一个例子可能是这样的:

myStr fred("Fred"); 
myStr quote(fred); 

我的问题是,有没有办法复制的对象弗雷德反对在构造函数中报价不复制数据(即STRLEN,DATALEN和数据)的每个单独的作品呢?对于这个任务,只有3个数据,但是说有50个,或100个,这将是漫长而乏味的。我试图寻找答案,并且遇到了复制构造函数,但是我不知道它们是如何工作的,或者如果他们只是手动复制每一块数据。我对类的语法很陌生,所以我很抱歉如果答案很微不足道,我只是在所有错误的地方寻找答案。谢谢。

+2

没有。你必须按照正确的顺序乖乖地复制需要复制的所有内容。在这里,你不能只复制一切。您还需要将新对象的指针初始化为新的动态分配的“数据”。并且不要忘记赋值运算符。 –

+1

如果您在班级中有50或100名成员,您会遇到严重的设计问题。 –

回答

0

有没有办法在构造函数中将对象fred复制到对象引用而不复制每个单独的数据片段(即strLen,dataLen和data)?

没有。复制构造函数(和复制赋值运算符)的作用是根据需要复制每个单独的字段。在你的情况下,由于你的数据是动态分配的,这也意味着分配一个新的内存块来复制字符数据。

对于这个任务,只有3个数据,但说有50个,或100个,这将是漫长而乏味的。

是的,这会是这样,这是为什么:

  1. 类应尽可能短和精确。然后可以使用更小的类来设计更大更复杂的类,以有效地管理数据。

  2. 您应该使用编译器可以为您复制的数据类型。如果您没有提供复制构造函数(或复制赋值运算符),则编译器会为您生成一个默认函数(除非您告诉编译器不要这样做 - 仅限C++ 11和更高版本)复制。对于普通数据类型以及实现适当复制语义(复制构造函数和复制赋值运算符)的用户定义类型,该默认实现可以正常工作。

在您的例子,如果你有一个std::string场更换你的三个领域,你的类就不需要自定义实现复制语义了,编译器生成的拷贝构造函数和拷贝赋值操作符就足够了。

如果您在复制数据时需要考虑实施手动内存管理,请阅读Rule of Three以及为什么适当的复制语义非常重要。

相关问题