在面向对象的程序设计之中,一般的类之中最重要的四个函数为:
1.构造函数
2.赋值函数(重载=)
3.拷贝构造函数
4.析构函数
示例:
<span style="font-size:14px;">#include <bits/stdc++.h>
using namespace std;
class B{
private:
int x,y;
public:
B()
{
x=y=0;
cout<<"constructor1"<<endl;
};
B(int i){
x=i;y=0;
cout<<"constructor2"<<endl;
};
B(int i,int j)
{
x=i;y=j;
cout<<"constructor3"<<endl;
};
virtual ~B(){
cout<<"Destructor"<<endl;
};
void print(){
cout<<"x="<<x<<' '<<"y="<<y<<endl;
};
};
int main(int argc, char** argv) {
B *p;
int i;
p=new B[3];
p[0]=B();
p[1]=B(1);
p[0]=B(2,3);
for(i=0;i<3;i++){
p[i].print();
}
delete []p;
return 0;
}
</span>
运行的结果是:
一开始在想为什么在new对象申请了三个空间之后(调用三次构造函数)第四个构造函数紧接着就调用了一次析构函数。
因为在赋值的过程中创建了一个临时变量来进行赋值,在系统默认的赋值函数结束之后析构了临时的对象。
析构函数一般在以下几个情况被调用:
1.
全局对象、静态全局对象在主函数执行之前被构造,直至主函数结束后析构。
2.静态局部对象在其所在的函数第一次被调用时创建,直至主函数结束后析构。.
3..局部自动对象(包括值传递的形参对象)在其所在函数调用时创建,函数返回后析构。
4..函数值返回的临时对象在函数返回时创建,在参与其所在的表达式运算后析构。
5..动态对象(堆对象)在执行new操作时创建,在执行delete时析构。
而且析构顺序为(反向析构):派生类—> 组合成员对象—>非虚基类—>虚基类