问题描述
- 请问C++析构函数的问题。
-
#includeusing 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的构造函数和析构函数分别是怎么调用的。谢谢。
但是为什么程序没有输出结果。
解决方案
C++ 析构函数
C++中基类的虚析构函数问题
c++ 析构函数为虚函数的问题
解决方案三:
析构要在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