手动对象构造函数调用

manual object constructor call

本文关键字:函数调用 对象      更新时间:2023-10-16

你能告诉我是否可以手动调用对象构造函数吗?我知道这是错误的,我永远不会在我自己的代码中做这样的事情,我知道我可以通过创建和调用初始化函数来解决这个问题,但是问题是我偶然发现了一个案例,其中对象及其父级的构造函数中有数千行代码......

class MyClass()
{
    MyClass() { }
    virtual ~MyClass();
    void reset()
    {
         this->~MyClass();
         this->MyClass::MyClass(); //error: Invalid use of MyClass
    }
};

您仍然可以将构造/销毁移动到单独的函数中并直接调用它们。 即

class MyClass {
public:
    MyClass() { construct(); }
    ~MyClass() { destruct(); }
    void reset() {
        destruct();
        construct();
    }
private:
    void construct() {
        // lots of code
    }
    void destruct() {
        // lots of code
    }
};

您可以使用放置新语法:

this->~MyClass(); // destroy
new(this) CMyClass(); // construct at the same address

使用放置 new 调用构造函数

new (address) MyClass();

这会在地址的空白空间中构造一个 MyClass。

不过,在课堂永远不会这样做!

编辑
如果您已经有一个正确类型的对象,并且想要为其分配默认值,则替代方法是

*this = MyClass();

这将创建一个具有默认值的新对象,并将该值分配给现有对象。