请问C++析构函数的问题。

图片说明
#include

using namespace std;

class A
{
public:
A(){cout<<"Build A"<<endl;}
~A(){cout<<"Destroy A"<<endl;}
};

class B:public A
{
public:
B():A(){cout<<"Build B"<<endl;}
~B(){cout<<"Destroy B"<<endl;}
};

int main()
{
B Out();
return 0;
}
我想看一看:
创建B对象的时候 AB的构造函数和析构函数分别是怎么调用的。谢谢。
但是为什么程序没有输出结果。


图片说明

析构要在main函数退出的时候 所以你看不到输出了 可以放到一个函数中用B做局部变量

创建B对象时,先执行基类A的构造函数,再执行派生类B的构造函数,释放时,先执行派生类B的析构函数,再执行基类A的析构函数

图片说明

图片说明

首先调用构造函数是两种,一种是像定义普通类型一样(int n;),另一种是new申请分配空间(new)

 B b;
 B*  pB = new B();

这两种方式都是自动调用构造函数实例化对象B。

 B* pB;//注意这种形式是实例化对象的,只是定义了这个类类型的指针而已 B* pB = 0;一般这么用,以后你会明白

他们中给你的例子可以看一下,为什么有些是没有调用析构呢,因为析构函数是在对象作用域之外才会自动调用,
注意看我楼上和其他人的区别,因为那个对象定义在一个函数中,函数调用过之后就到了定义对象就到了作用域
之外了,所以自动调用了。
你有两种方式调用析构,手动调用这个析构函数,一般使用中是new然后delete

你的B out(); 编译器把它编译成声明一个返回值为B的函数了, 如果要定义对象不加()

把你的B Out(); 放在{}里面

main()
{
{//写在之里面!
B ot();
}

system("pause");

}

#if 1
#include
using namespace std;

class A
{
public:
A(){ cout << "Build A" << endl; }
~A(){ cout << "Destroy A" << endl; }
};
class B :public A
{
public:
B() :A(){ cout << "Build B" << endl; }
~B(){ cout << "Destroy B" << endl; }
};

int main()
{
//B Out(); //你不能这样定义B类型的对象,这样子编译器会认为他是函数并且以函数的方式去处理...
B Out; //这才是正确的定义
return 0;
}
#endif

图片说明

把B Out()改成B Out

把B Out()改成B Out

提示一点: 基类的析构函数一般要声明为虚函数,,否则可能内存泄露哦