gpt4 book ai didi

c++ - 为什么不能显式调用构造函数而析构函数可以?

转载 作者:IT老高 更新时间:2023-10-28 12:47:12 25 4
gpt4 key购买 nike

在下面的 C++ 代码中,我可以显式调用析构函数,但不能显式调用构造函数。这是为什么?在 dtor 的情况下,不是更明确的 ctor 调用 expressiveunified 吗?

class X { };

int main() {
X* x = (X*)::operator new(sizeof(X));
new (x) X; // option #1: OK
x->X(); // option #2: ERROR

x->~X();
::operator delete(x);
}

最佳答案

因为在构造函数启动之前,该地址没有X类型的对象。因此,将 x 取消引用为 X 类型或访问它的成员/方法将是未定义的行为。

所以 x->X(); (假设语法)和 x->~X() 之间的主要区别在于,在第二种情况下,您有一个您可以在其上调用(特殊)成员(例如析构函数)的对象,而在第一种情况下,还没有对象您可以在其上调用方法(甚至是特殊方法 - 构造函数)。

您可以争辩说这条规则可能有一个异常(exception),但最终这将是一个语法偏好问题,在这两种情况下您都会有不一致的地方。使用当前语法,对构造函数的调用看起来不像对构造函数的调用,在您建议的语法中,与析构函数调用将是对称的,但是管理何时可以取消引用/访问对象的方法的规则不一致。实际上,必须有一个异常(exception),允许在还不是对象的东西上调用方法。那么你必须在标准的字母中严格定义还不是对象的东西

关于c++ - 为什么不能显式调用构造函数而析构函数可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45142080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com