引言上章总结了默认成员函数的构造函数部分(中间隔的时间有点久...),现在让我们从析构函数开始.析构函数关于析构函数,与构造函数相反的是,构造函数是作为对对象的初始化,而析构函数是对对象起到释放资源的作用,系统会在需要销毁对象的时候(也就是生命周期结束)自动调用,当然与构造函数相同的是,有深浅之分,浅的部分系统自动生成(未显示写的情况)且自动调用(包括自定义类型),涉及资源的深释放需要我们自己手写(所以绝大部分都得手写).案例:#includeiostream using namespace std; typedef int STDataType; class Stack { public: Stack(int n 4) { _a (STDataType*)malloc(sizeof(STDataType) * n); if (nullptr _a) { perror(malloc申请空间失败); return; } _capacity n; _top 0; } ~Stack() { cout ~Stack() endl; free(_a); _a nullptr; _top _capacity 0; } private: STDataType* _a; size_t _capacity; size_t _top; };注:一个局部域的多个对象后定义的先析构#includeiostream using namespace std; class TT { public: TT (const char* name) :_name(name) { } ~TT () { cout _name endl; } private: const char* _name; }; int main () { TT t1 (t1); TT t2 (t2); return 0; }运行结果:拷贝构造函数拷贝构造函数,其实是一个特殊的构造函数,下面有几个需要注意的点:1.拷贝构造函数是构造函数的一种重载2.拷贝构造的第一个参数类型必须是类类型的引用,后面的参数必须有缺省值.原因:因为如果采用传值方式的方法,会引发无穷递归(若采用传值传参,每次调用拷贝拷贝构造之前都会传值传参,在语法下,传值传参是一种拷贝,然后不断重复这种拷贝传值传参,便形成了无穷递归)3.自定义类型对象进行拷贝的行为时必须调用拷贝构造,所以其的传值传参和传值返回都会调用它的拷贝构造4.若未显示写拷贝构造,系统会自动生成它的拷贝构造,当然是浅拷贝,一字节一字节地拷贝,所以大部分涉及资源的拷贝构造还得自己写.误导:传值返回会产生一个临时对象调用拷贝构造,传值引用返回返回的是返回对象的引用,没有产生拷贝,但如果这个返回对象是一个局部域的对象,那么局部域销毁的时候会导致这个引用的对象也跟着销毁,这个时候就会导致野引用,所以在引用传值返回的时候,一定要确保引用对象还在,这个时候才能用引用返回.结语这期总结了析构函数与拷贝构造函数,若有不足欢迎补充,在这里欢迎各位看官补充,祝大家身体健康,bug少少!!!
(三)C++类与对象知识地图:从语法到常见坑的一次梳理
发布时间:2026/6/3 10:16:12
引言上章总结了默认成员函数的构造函数部分(中间隔的时间有点久...),现在让我们从析构函数开始.析构函数关于析构函数,与构造函数相反的是,构造函数是作为对对象的初始化,而析构函数是对对象起到释放资源的作用,系统会在需要销毁对象的时候(也就是生命周期结束)自动调用,当然与构造函数相同的是,有深浅之分,浅的部分系统自动生成(未显示写的情况)且自动调用(包括自定义类型),涉及资源的深释放需要我们自己手写(所以绝大部分都得手写).案例:#includeiostream using namespace std; typedef int STDataType; class Stack { public: Stack(int n 4) { _a (STDataType*)malloc(sizeof(STDataType) * n); if (nullptr _a) { perror(malloc申请空间失败); return; } _capacity n; _top 0; } ~Stack() { cout ~Stack() endl; free(_a); _a nullptr; _top _capacity 0; } private: STDataType* _a; size_t _capacity; size_t _top; };注:一个局部域的多个对象后定义的先析构#includeiostream using namespace std; class TT { public: TT (const char* name) :_name(name) { } ~TT () { cout _name endl; } private: const char* _name; }; int main () { TT t1 (t1); TT t2 (t2); return 0; }运行结果:拷贝构造函数拷贝构造函数,其实是一个特殊的构造函数,下面有几个需要注意的点:1.拷贝构造函数是构造函数的一种重载2.拷贝构造的第一个参数类型必须是类类型的引用,后面的参数必须有缺省值.原因:因为如果采用传值方式的方法,会引发无穷递归(若采用传值传参,每次调用拷贝拷贝构造之前都会传值传参,在语法下,传值传参是一种拷贝,然后不断重复这种拷贝传值传参,便形成了无穷递归)3.自定义类型对象进行拷贝的行为时必须调用拷贝构造,所以其的传值传参和传值返回都会调用它的拷贝构造4.若未显示写拷贝构造,系统会自动生成它的拷贝构造,当然是浅拷贝,一字节一字节地拷贝,所以大部分涉及资源的拷贝构造还得自己写.误导:传值返回会产生一个临时对象调用拷贝构造,传值引用返回返回的是返回对象的引用,没有产生拷贝,但如果这个返回对象是一个局部域的对象,那么局部域销毁的时候会导致这个引用的对象也跟着销毁,这个时候就会导致野引用,所以在引用传值返回的时候,一定要确保引用对象还在,这个时候才能用引用返回.结语这期总结了析构函数与拷贝构造函数,若有不足欢迎补充,在这里欢迎各位看官补充,祝大家身体健康,bug少少!!!