当我们遵循C ++中的“RAII”方式时,是否有必要使用静态构造函数?

时间:2010-11-05 09:38:36

标签: c++ raii

如果我遵循RAII规则并且将在C ++中开发一个类,那么是否需要使用静态构造函数?静态构造函数会以任何方式帮助我,或者是一个错误的步骤吗?

3 个答案:

答案 0 :(得分:4)

这没有任何意义,你不能拥有静态构造函数。构造函数的整个目的是初始化类的特定实例;如果它是静态的,它将不属于任何实例。

RAII只是说你需要释放析构函数中的资源,并且该资源的获取发生在将运行该析构函数的对象的初始化(构造)上。 (哪个entails你需要一个工作或禁止的拷贝构造函数,以及一个working assignment operator。)

答案 1 :(得分:1)

你可以使用一些静态函数CreateInstance()来返回你的类的实例。

使用RAII,您的函数可能必须返回一些指向您创建的实例的智能指针,以避免复制实际对象。然后存储此指针,如果您需要在其他地方复制它。当所有智能指针被破坏时,对象也将被破坏。如果这就是你想要的,那么是 - 你可以拥有“静态构造函数”。

当然,它不是RAII的必需品,通常只是不必要的并发症。

答案 2 :(得分:1)

我认为你在谈论一个静态工厂函数,它创建了一个类的实例(正如其他人指出的那样)。在这种情况下,您不需要使用RAII模式。

请记住,您需要将您的类分配到堆栈,以便 构造函数被调用(自动)并初始化各种数据。 还有, 当堆栈展开并执行其他操作时(自动)调用析构函数:例如释放资源等。

如果您的类静态初始化它的数据,则RAII模式将失败,因为静态保存的数据未绑定到类的实例。因此,当堆栈展开时,没有要破坏的实例,不会调用析构函数,并且不会实现RAII模式。