首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >什么时候我们必须使用复制构造函数?

什么时候我们必须使用复制构造函数?
EN

Stack Overflow用户
提问于 2010-07-19 13:21:03
回答 4查看 73K关注 0票数 90

我知道C++编译器为类创建了一个复制构造函数。在哪种情况下,我们必须编写用户定义的复制构造函数?你能举一些例子吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-19 13:22:37

由编译器生成的复制构造函数执行成员级复制。有时这还不够。例如:

代码语言:javascript
代码运行次数:0
运行
复制
class Class {
public:
    Class( const char* str );
    ~Class();
private:
    char* stored;
};

Class::Class( const char* str )
{
    stored = new char[srtlen( str ) + 1 ];
    strcpy( stored, str );
}

Class::~Class()
{
    delete[] stored;
}

在这种情况下,以成员方式复制stored成员不会复制缓冲区(仅复制指针),因此第一个要销毁的共享缓冲区的副本将成功调用delete[],第二个将运行未定义的行为。您需要深度复制复制构造函数(以及赋值运算符)。

代码语言:javascript
代码运行次数:0
运行
复制
Class::Class( const Class& another )
{
    stored = new char[strlen(another.stored) + 1];
    strcpy( stored, another.stored );
}

void Class::operator = ( const Class& another )
{
    char* temp = new char[strlen(another.stored) + 1];
    strcpy( temp, another.stored);
    delete[] stored;
    stored = temp;
}
票数 77
EN

Stack Overflow用户

发布于 2010-07-19 13:24:54

如果你有一个动态分配内容的类。例如,您将一本书的标题存储为char *并将标题设置为new,copy将不起作用。

您必须先编写一个执行title = new char[length+1],然后执行strcpy(title, titleIn)的复制构造函数。复制构造函数将只做一个“浅”复制。

票数 6
EN

Stack Overflow用户

发布于 2010-07-19 13:29:24

当对象通过值传递、通过值返回或显式复制时,将调用Copy Constructor。如果没有复制构造函数,c++会创建一个默认的复制构造函数,用于进行浅层复制。如果对象没有指向动态分配内存的指针,那么浅拷贝就可以了。

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

https://stackoverflow.com/questions/3278625

复制
相关文章

相似问题

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