gpt4 book ai didi

c++ - 为什么我不能在 C++ 中从该类的实例调用我的类的构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:14:32 25 4
gpt4 key购买 nike

类的对象什么时候可以调用该类的析构函数,就好像它是一个常规函数一样?为什么它不能调用同一个类的构造函数,作为它的常规函数​​之一?为什么编译器会阻止我们这样做?

例如:

class c
{
public:
void add() ;
c();
~c() ;
};

void main()
{
c objC ;
objC.add() ;
objC.~c() ; // this line compiles
objC.c() ; // compilation error
}

最佳答案

根据定义,构造函数仅在创建对象时调用一次。如果你有权访问一个对象,那么它一定已经被创建,所以你不能再次调用构造函数 - 这就是为什么不允许显式构造函数调用的原因。同样,析构函数只能在对象被销毁时调用一次。如果这始终可以自动完成,那么该语言也将禁止显式析构函数调用。

但是,在某些情况下,您可能需要精确控制内存管理,以及在您管理的内存中显式创建和销毁对象的能力。为此,该语言提供了“placement new”以在任意位置创建对象,并提供显式析构函数调用以销毁以这种方式创建的对象。显式构造函数调用不会有用,因为您需要能够指定新对象的位置 - 因此您得到的是“placement new”。显式析构函数调用就足够了,因此无需发明某种匹配的“放置删除”。

因此:显式构造函数调用没有有效用途,因此不允许。显式析构函数调用有一个有效的用途,所以它们(在语法上)是允许的,规则是你只能在不会以其他方式被销毁的对象上使用它们,即使用“placement new”创建的对象,并且在那案例只给他们打电话一次。以任何其他方式使用它们,就像许多 C++ 错误一样,将编译但给出未定义的行为。

关于c++ - 为什么我不能在 C++ 中从该类的实例调用我的类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2146901/

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