C ++:在构造函数

时间:2016-12-04 03:09:09

标签: c++ string constructor

在我的代码中,我正在尝试创建一个字符串类(它是一个赋值),并且有一个包含以下数据的类:

private:
  int   strLen;
  int   dataLen;
  char* data;

和构造函数:

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

第三个构造函数接受一个字符串数组,为数据分配空间并将其复制,将strLen设置为字符串中的字符数,将dataLen设置为数组的大小。第二个构造函数是类似的,但是它需要一个完整的对象,并且应该将它复制到构造函数正在创建的新对象中。一个例子可能如下所示:

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

我的问题是,有没有办法将对象fred复制到构造函数中的对象引用而不复制每个单独的数据(即strLen,dataLen和data)?对于这项任务,只有3个数据,但是说有50个或100个,这将是漫长而乏味的。我尝试寻找答案并遇到了复制构造函数,但我不确定它们是如何工作的,或者它们是否只是手动复制每个数据。我对类的语法不熟悉,所以如果答案是微不足道的话,我很抱歉,我只是在所有错误的地方寻找答案。谢谢。

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

是的,这就是原因:

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

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

  3. 在您的示例中,如果您使用单个std::string字段替换了三个字段,则您的类将不再需要实现自定义复制语义,编译器生成的复制构造函数和复制赋值运算符就足够了。 / p>

    如果您在复制数据时需要担心实施手动内存管理,请阅读Rule of Three以及为什么正确的复制语义很重要。