有没有一种方法可以在类C ++中取消初始化变量

时间:2019-09-12 19:50:03

标签: c++ class constructor

因此,最近我刚刚看了一段有关c ++的视频,解释了成员初始化器列表的用法。我想知道是否有一种方法可以在解构函数中使用成员uninizializer(或类似的东西)列表。例如,我有一个名为Entity的类,该类具有2个私有值x和y,并且通过成员初始化程序列表在我的Initializer中将它们都设置为5,但是我必须以通常的方式在解构函数中将它们初始化(x = 0 ;. ..)。

class Entity
{
private:
    int x, y;
public:
    Entity(): x(5), y(5)
    {
    }

    ~Entity() //Here I want to set x and y to 0 like this: x(0), y(0)
    {
        x = 0;
        y = 0;
    }
};

1 个答案:

答案 0 :(得分:2)

析构函数完成之后,对象将被销毁,您将不再能够访问xy成员。因此,给它们分配零是没有用的,并且编译器可能会优化它,因为可观察到的行为不会改变。

如果出于加密原因将内存归零,那么分配甚至是简单的fillmemset可能是不够的,可以对其进行优化。参见,例如,cppreference memset。您可能需要使用更复杂的内容,例如:

~object()
{
    std::fill(const_cast<volatile T*>(data.begin()),
              const_cast<volatile T*>(data.end()),
              0);
}

如果您要编写一个RAII类来在销毁时释放资源,则您可能不希望简单地重置资源处理程序的值。例如:

template <typename T>
class object {
    T* elem;
public:
    // ...
    template <typename... Args>
    object(std::in_place_t, Args&&... args) // for example
    {
        elem = new T(std::forward<Args>(args)...);
    }
    ~object()
    {
        delete elem; // elem = nullptr won't work
    }
};