C++ 在对象初始化期间调用析构函数?
鉴于下面的代码,为什么我会得到一个关于A的析构函数是私有的错误?显然它是私有的,但我不明白为什么以这种方式初始化B的对象实例会导致调用A的析构函数 很抱歉有任何错误,我正在从非网络系统的内存中重新创建代码,并且没有编译器C++ 在对象初始化期间调用析构函数?,c++,C++,鉴于下面的代码,为什么我会得到一个关于A的析构函数是私有的错误?显然它是私有的,但我不明白为什么以这种方式初始化B的对象实例会导致调用A的析构函数 很抱歉有任何错误,我正在从非网络系统的内存中重新创建代码,并且没有编译器 class A { public: A(int val) : x(val) {} private: int x; ~A() {} }; class B { public: B() : a
class A
{
public:
A(int val) : x(val) {}
private:
int x;
~A() {}
};
class B
{
public:
B() : aInstance() {}
private:
A aInstance;
};
int main()
{
B b;
}
由于
B
类包含A
类的实例(作为私有字段aInstance
),因此当B
的实例被销毁时,必须将其销毁
这正是main
中发生的事情。AsB代码在堆栈上被分配和创建,当函数结束时,它就超出了范围,必须被销毁,就像C++中的每个局部对象一样,在主体的末尾, ,当B超出范围时,B应该如何解除A类型的成员?
它不能,因为您已声明析构函数为private。原因是A
是B
的成员。类型B
的默认生成构造函数必须为其每个字段的规则调用析构函数。因此这里有一个对A
析构函数的隐式调用,它无权访问该析构函数,您会得到错误初始化本身并不涉及使用dtor,但是B
的实例在main
的末尾被销毁。B
包含一个A
,因此当B
被销毁时,A
也必须被销毁——但是A
的dtor不可用,因此无法生成执行该操作的代码。我怀疑A
的析构函数是从构造函数中调用的。A
的析构函数可能在b
超出main的作用域时(当程序终止时)被调用。实际上是b需要访问析构函数,而不是main()
如果你让B成为a的朋友,那就行了。如果您使main()
成为某个应用程序的朋友,它将不会编译
因为A的实例被声明为“自动”,即它是类成员,所以它的删除不会发生在B的析构函数中,而是发生在B的销毁过程中。然而,这被认为是在B作为类的访问范围内。不能对基于堆栈的对象进行访问(即使是间接的)。这里有一个关于私有析构函数用法和限制的很好的讨论:存在问题的不是main,而是B,在其中,编译器将自动创建需要删除的析构函数,但它无权访问的析构函数。