手动对象构造函数调用
manual object constructor call
你能告诉我是否可以手动调用对象构造函数吗?我知道这是错误的,我永远不会在我自己的代码中做这样的事情,我知道我可以通过创建和调用初始化函数来解决这个问题,但是问题是我偶然发现了一个案例,其中对象及其父级的构造函数中有数千行代码......
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();
这将创建一个具有默认值的新对象,并将该值分配给现有对象。
相关文章:
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- 返回指向对象的指针的函数调用是否为 prvalue?
- 是什么让放置新调用对象的构造函数?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- 线程调用的函数对对象删除是否安全?
- 通过直接函数调用将 std::p romise 对象传递给函数
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- C++析构函数调用两次,堆栈分配的复合对象
- c++ 替换调用对象方法的宏函数
- 将可调用对象传递给采用 std::function 的构造函数
- 双指针在使用 new 时不调用对象构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 在函数调用中C++临时对象的生存期
- std::atexit 从全局对象的构造函数调用时的排序
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 在函数调用中创建的对象的生存期