所以,让我们说我有一个名为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;
}
我知道这并不一定要复制任何“复制”。并且具有不同的指针(属于不同的对象)可能存在风险。但是它被认为是复制构造函数吗?或者,为了使它成为复制构造函数,还必须创建第二个数组?
从我读过的内容来看,我觉得第二种情况就是如此,但我需要一个明确的“不要复制构造函数”在我的脑海中完全超越这一点。 谢谢。
答案 0 :(得分:4)
正如评论者都正确指出的那样,无论函数的内容如何,你拥有的 是一个复制构造函数。
这是一个复制构造函数,因为标准是这样说的(see 12.8.2):
如果第一个参数的类型为
X
,X&
,const X&
或volatile X&
,则类const volatile X&
的非模板构造函数是一个复制构造函数,并且没有其他参数,或者所有其他参数都有默认参数(...)。
由于您有classname
的非模板构造函数,其签名与const classname&
匹配,因此您有一个复制构造函数。也许不是一个很棒的复制构造函数,可能是一个甚至没有复制的复制构造函数,但仍然是一个复制构造函数。
由于我不能比评论的人更好说,我只是引用它们:
复制构造函数由其签名定义,不函数体中的内容.- @liliscent
你正在做shallow copy rather than a deep copy,但它仍然是一个复制构造函数.- @acraig5075