-2

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

如果我们使用静态数组或std::string?整个静态数组std::string会被默认的复制构造函数复制吗?

文件指针呢?内存没有在那里分配。

4

1 回答 1

3

资源是您需要明确获取和释放的任何东西。

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

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

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

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

单一职责原则的使用是您的代码保持本地,即对于每个资源,您有一行代码负责。如果您有不止一个,您通常会为错误处理和多个退出点带来指数级增长的分支。相比之下,单一职责意味着您只需要为每个资源担心一个地方。

于 2013-09-09T09:17:41.270 回答