当你只复制指针而不是整个数据时,它仍然是一个复制构造函数吗?

时间:2018-02-02 08:00:43

标签: c++ copy-constructor

所以,让我们说我有一个名为classname的类,这个类有char*私有数据成员。

在我正在上课的课程中,教授希望我们像下面那样做,基本上创建一个全新的数组。

classname(const classname & source)
{
         c_string = new char[strlen(source.c_string)+1];

         strcpy(c_string, source.c_string);

}

但是,如果这两个对象基本上共享相同的单个数组(已经创建),就像这个一样。

classname(const classname & source)
{
         c_string = source.c_string;
}

我知道这并不一定要复制任何“复制”。并且具有不同的指针(属于不同的对象)可能存在风险。但是它被认为是复制构造函数吗?或者,为了使它成为复制构造函数,还必须创建第二个数组?

从我读过的内容来看,我觉得第二种情况就是如此,但我需要一个明确的“不要复制构造函数”在我的脑海中完全超越这一点。 谢谢。

1 个答案:

答案 0 :(得分:4)

正如评论者都正确指出的那样,无论函数的内容如何,​​你拥有的 是一个复制构造函数。

这是一个复制构造函数,因为标准是这样说的(see 12.8.2):

  

如果第一个参数的类型为XX&const X&volatile X&,则类const volatile X&的非模板构造函数是一个复制构造函数,并且没有其他参数,或者所有其他参数都有默认参数(...)。

由于您有classname的非模板构造函数,其签名与const classname&匹配,因此您有一个复制构造函数。也许不是一个很棒的复制构造函数,可能是一个甚至没有复制的复制构造函数,但仍然是一个复制构造函数。

由于我不能比评论的人更好说,我只是引用它们:

  

复制构造函数由其签名定义,函数体中的内容.- @liliscent

  

你正在做shallow copy rather than a deep copy,但它仍然是一个复制构造函数.- @acraig5075