只有在动态内存分配的情况下才需要复制构造函数?

时间:2013-09-09 09:10:36

标签: c++ copy-constructor

那么,当且仅当我们打算使用new分配内存时,我们还需要用户定义的复制构造函数吗?

如果我们使用静态数组或std::string怎么办? 整个静态数组和std::string将由默认的复制构造函数复制?

文件指针怎么样?内存没有在那里分配。

1 个答案:

答案 0 :(得分:2)

资源是您需要明确获取和发布的任何内容。

管理资源的类通常需要用户定义的析构函数,因此需要用户定义(或删除)的复制构造函数和赋值运算符,并且可能还需要移动操作。

然而,良好的设计要求“单一责任规则”,即每个班级应该只承担一项责任,仅此而已。应用此规则意味着将您的资源包装到一个类中,该类的唯一职责是管理资源,并向外部呈现类似值或类似值的语义。

以下是使用资源管理类打开文件的示例:

if (auto fp = std::unique_ptr<FILE, int(*)(FILE*)>(std::fopen("/dev/null", "wb"),
                                                   std::fclose))
{
    std::fwrite(buf, 1, sizeof buf, fp.get());
}

使用单一责任原则是您的代码仍然是本地,即每个资源都有一行代码来承担责任。如果您有多个,则通常会出现指数增长的分支,以便进行错误处理和多个退出点。相比之下,单一责任意味着您只需要为每个资源担心一个地方。