- 析构函数绝对不会有返回值,也没有任何参数,绝对不可能重载
- 析构函数用于释放在构造函数或对象生命周期内分配的资源,在对象结束生命后会自动调用析构函数来善后。感觉一般都是我们在构造对象的时候,在对象内部要手动申请一块内存,然后我们在析构函数中需要将其释放掉
- 即使是自己定义的类,C++也提供默认的成员逐一初始化。比如下面的代码
MyClass zhangsan;
MyClass lisi= zhangsan;
MyClass wangwu;
wangwu=lisi;
以上代码都可以在VS2015上编译通过。其具体在内部执行的动作是:
- 让lisi wangwu都具有MyClass对应的成员变量和成员函数。
- 将zhangsan中成员变量的值赋给lisi wangwu
- 注意:对于类中自己申请的内存,eg:
int *ptr =new int[20];
在默认类之间初始化的时候,lisi只会新建一个指针ptr,分配指针所占的内存空间,同时将指针的值取值为 zhangsan的ptr的值,也就是会指向zhangsan分配的内存空间上去(new int[20])。当zhangsan这个对象的生命周期结束之后,调用析构函数导致ptr指向的我们自己分配的内存被释放掉的时候,lisi的ptr指向的内存就没有意义了。
我觉得这种情况最容易出现在函数结束的时候返回值为类的时候。因为就是在函数调用结束的时候会发生部分对象生命周期结束(局部变量),而部分任然保留。
而在对象生命周期上,我们可以总结以下几点
1) 如果在一个函数中定义了一个对象(auto 局部变量),当这个函数运行结束时,对象就会被销毁,在对象被销毁前自动执行析构函数。
2) static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。
3) 如果定义了一个全局对象(类似于在main函数中定义了一个变量),也只有在程序结束时才会调用该全局对象的析构函数。
4) 如果用 new 运算符动态地建立了一个对象,当用 delete 运算符释放该对象时,先调用该对象的析构函数。
因此为了解决上诉问题,我们不妨自己去写类之间的互相赋值和互相初始化函数,C++为我们提供了这样的功能。
对于用类的一个对象初始化另外一个对象,我们可以自己写如下函数
MyClass::MyClass(const MyClass &inputobjest)
{
this->age=inputobjest.age;
this->ptr =new int[20];
for(int i=0;i<20;i++)
{
this->ptr[i]=inputobjest[i];
}
}