C++超详细讲解析构函数
析构函数是特殊的成员函数特征如下析构函数名是~类名无参数无返回值一个类有且只有一个析构函数对象声明周期结束编译器自动调用析构函数12345678910111213141516171819202122232425262728293031classStack{public:Stack(intcapacity 4):_size(0),_capacity(capacity),_p(newint[_capacity]){cout Stack(int capacity 4) endl;}~Stack(){cout ~Stack() endl;if(_p){delete[](_p);_p nullptr;}_size _capacity 0;}private:int_capacity;int_size;int* _p;};intmain(){Stack s;return0;//程序结束调用s的析构函数}输出析构函数处理自定义类型1234567891011121314151617181920212223242526272829303132333435363738394041classString{public:String(constchar* str songxin){cout String(const char* str \songxin\) endl;_str (char*)malloc(strlen(str) 1);strcpy(_str, str);}~String(){cout ~String() endl;free(_str);_str nullptr;}private:char* _str;};classPerson{public:Person():_age(20),_name(){cout Person() endl;}~Person(){cout ~Person() endl;}private:String _name;int_age;};intmain(){Person p;return0;}输出析构函数在程序即将结束时调用了Person的析构函数在Person类的析构函数即将结束接着调用String类的析构函数。归纳一下析构函数是与构造函数执行相反的操作的构造函数负责给对象成员变量初始化并加载资源而析构函数则是给对象的成员变量清理资源而不是清理对象本身。编译器生成的默认析构函数编译器默认生成的析构函数能做些什么工作呢我们前面已经介绍了编译器生成的构造函数会去只会处理自定义类型的成员变量那么析构既然和构造相对应析构也应该是只去处理自定义类型的成员变量吧确实如此析构函数不会对内置类型有任何处理只会在调用自身的析构后再去调用自定义类型成员的析构。关于编译器自动生成的析构函数下面的程序我们会看到编译器生成的析构函数会对自定类型成员调用它的析构函数。1234567891011121314151617181920212223242526272829303132333435363738classString{public:String(constchar* str songxin){cout String(const char* str \songxin\) endl;_str (char*)malloc(strlen(str) 1);strcpy(_str, str);}~String(){cout ~String() endl;free(_str);_str nullptr;}private:char* _str;};classPerson{public:Person():_age(20),_name(){cout Person() endl;}private:String _name;int_age;};intmain(){Person p;return0;}输出默认生成的析构函数对成员变量的处理内置类型不处理自定义类型成员调用相应的析构函数那成员变量中的内置类型处不处理其实都无所谓嘛反正都要归还给操作系统但是有例外如果成员变量含有指针并且指针指向一块我们正使用的空间指针也是内置类型那如果不释放指针指向的那块空间就会造成内存泄漏而编译器生成的析构函数是不会处理此情况的因为需要我们在析构函数中主动释放内存也就是说需要我们显式的去定义析构函数。12345678910111213141516171819202122232425262728293031classStack{public:Stack(intcapacity 4):_size(0),_capacity(capacity),_p(newint[_capacity])//使用new去申请内存{cout Stack(int capacity 4) endl;}~Stack(){cout ~Stack() endl;if(_p){delete[](_p);//释放内存_p nullptr;}_size _capacity 0;}private:int_capacity;int_size;int* _p;};intmain(){Stack s;return0;//程序结束调用s的析构函数}析构函数无论是我们显式定义的还是编译器生成的都会在对象的声明周期结束时自动调用并且会调用自定义类型成员变量的析构函数来释放资源而对内置类型不做处理。可以不显式定义析构函数的情况类的成员都是自定义类型的类的成员都是非指针的内置类型成员有指针但并没有管理内存资源如果类的成员变量有指针类型并且我们让指针指向了一块动态分配的空间那么就需要我们自己写析构函数了。总结不是类直接管理另一块内存资源的就不需要写析构函数编译器自己生成的就能处理。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2638824.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!