C++类的构造函数、析构函数

来源:互联网 发布:学软件软件好的学校 编辑:程序博客网 时间:2024/06/06 11:06
C++为了实现对象的创建时的自动初始化和自动销毁,提供了两种特殊的函数:构造函数和析构函数


代码举例:

#include<iostream>#include"Test.h"using namespace std;class Date  {public:Date():_year(1970),_month(1),_day(1){}Date(int y, int m, int d) :_year(y), _month(m), _day(d){}Date(int y) :_year(y){_month = 1;_day = 1;}//拷贝构造函数Date(const Date & d) :_year(d._year),_month(d._month),_day(d._day){}void Display(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}~Date(){cout << "析构函数!" << endl;}/*bool operator==(const Date& d){return this->_year == d._year&&this->_month == d._month&&this->_day == d._day;}*/friend bool operator==(const Date &d1, const Date &d2);private:int _year;int _month;int _day;};bool operator==(const Date &d1, const Date &d2){return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day);}int main(){Date d1(2015);Date d2(d1);Date d3(2016);bool b = (d1 == d2);cout << b << endl;d1.Display();d2.Display();system("pause");return 0;}

一、构造函数:为对象的成员变量提供初始化

它有如下特点:

1.没有返回值

2.函数名和类名相同

3.允许重载

4.可以使用构造函数初始化列表


构造函数允许重载,所以有多种形式的构造函数

主要有: 

(1)拷贝构造函数(复制构造函数):用一个类的对象来初始化这个类的另一个对象,若程序员没有自定义拷贝构造函数,编译器会根据成员变量的构造函数创建一个默认的构造函数。

Date(const Date & d) :_year(d._year),_month(d._month),_day(d._day){}

(2)无参构造函数:没有参数的或者参数都为默认值的构造函数,在调用时不需要参数。

Date():_year(1970),_month(1),_day(1){}

(3)带参构造函数:有参数的构造函数,拷贝构造函数就是一种带参构造函数

//3种都是
Date(int y, int m, int d) :_year(y), _month(m), _day(d){}Date(int y) :_year(y){_month = 1;_day = 1;}//拷贝构造函数Date(const Date & d) :_year(d._year),_month(d._month),_day(d._day){}  

(4)默认构造函数:在没有显式定义任何构造函数的情况下,编译器会创建一个默认的构造函数

Date d1;   //再没有定义构造函数时,隐式调用默认构造函数。


如果类内没有定义任何构造函数,则编译器会根据成员变量的默认构造函数来生成一个该类的默认构造函数

如果类内没有定义拷贝构造函数,则编译器会根据成员变量的拷贝构造函数来生成一个该类的拷贝构造函数


二、析构函数

析构函数用来在对象声明周期结束后来销毁对象的函数

析构对象有如下特点:

析构函数没有返回值

析构函数没有参数

对象在生命周期结束后自动调用析构函数销毁

析构函数函数名必须是“ '~'+类名 ”

析构函数代码:

<span style="white-space:pre"></span>~Date(){cout << "析构函数!" << endl;}
析构函数一般用于对象在堆内开辟动态空间后,在对象被销毁前应该释放这些申请空间,析构函数就是做这种善后清理工作的。

析构函数在对象的生命周期结束之时,会被自动调用,在析构函数中写上需要操作的代码,则对象销毁时这些代码会被自动的执行,而不需要显式的调用。

这样会使程序员不必时时刻刻担心内存泄漏的问题,达到一种自动销毁的过程。



0 0
原创粉丝点击