C++之构造函数,拷贝构造,析构函数

时间:2022-05-01 01:29:26

类是一种复杂的数据类型,它是将不同类型的数据与这些数据相关的操作封装在一起的一个集合,类具有对数据的抽象性,隐藏性,封装性
在类中,存在着六个默认函数,构造函数,拷贝构造函数,析构函数,赋值操作符重载,取地址操作符重载,const取地址操作符重载
构造函数:
是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内,只且只调用一次.
拷贝构造函数
只有单个形参,而且该形参是对本类类型对象的引用常用const修饰,其为特殊的构造函数,创建对象时是用已存在的对象对其初始化,由编译器自动调用
析构函数
与构造函数的功能相反,在对象被销毁时,由编译器自动调用,完成类的资源清理

class Date
{
public:
void GetDate(int year, int month, int day)
//自定义成员函数访问类成员

{
_year = year;
_month = month;
_day = day;
cout << "called" << endl;
}
Date(int year, int month, int day)
//显式构造函数
{
_year = year;
_month = month;
_day = day;
cout << "构造函数called\n" << endl;
}
//Date(int year, int month)//构造函数的重载
//{
// _year = year;
// _month = month;
// cout << "构造函数called\n" << endl;
//}
Date() //默认构造函数
{
cout << "默认构造 called\n" << endl;
}
~Date(); //析构函数
int IsLeapYear( );
void print();
private:
int _year;
int _month;
int _day;
};
//Date::Date(int year, int month, int day)构造函数类外定义
//显式构造函数
// {
// _year = year;
// _month = month;
// _day = day;
// cout << "构造函数called\n" << endl;
// }

int Date::IsLeapYear( )
{
return ((_year % 4 == 0 && _year % 100 != 0) || (_year % 400 == 0));
}
void Date::print()
{
cout << _year << ' ' << _month << ' ' << _day << endl;
}
Date::~Date()
//析构函数类外定义,也可在类内定义
{
cout << "析构 called" << _year << endl;
}

int main()
{
static Date d1(2005, 3, 18);// static 修饰类对象
Date d2(2009, 3, 15);
cout << "d1 is ";
d1.print();
cout << "d2 is ";
d2.print();
Date d3;
cout << "d3 is ";
d3.print();
d1.GetDate(2007, 3, 15);
cout << d1.IsLeapYear( ) << endl;
d1.print();
}

以上程序运行结果为:
C++之构造函数,拷贝构造,析构函数
**由图看出,类中定义了两个构造函数,其中一个为默认构造函数,一个显式定义的构造函数,一个析构函数,程序先创建一个静态的d1,这时调用显式构造函数,值为自赋值,d2调用显式构造。
d3则调用默认构造函数,值为随机值。析构时与创建顺序刚好相反,先创建的对象后释放,后创建的对象先释放(在相同生命周期情况下)**
当 static 定义的d1 不赋初值时,情况会怎样呢?

static Date d1;// static 修饰类对象
Date d2(2009, 3, 15);
cout << "d1 is ";
d1.print();
cout << "d2 is ";
d2.print();
Date d3;
cout << "d3 is ";
d3.print();
d1.GetDate(2007, 3, 15);
cout << d1.IsLeapYear( ) << endl;
d1.print();

C++之构造函数,拷贝构造,析构函数
我们可以看出会调用默认构造函数,并初始化对象为0;
总结:
构造函数:
1:是一种成员函数,说明在类体内,函数体可写在类体内,也可写在类体外
2:名字与类名相同,定义和说明时,不必指明类型
3:可以有参数,可以无参数,可以重载。
4:多用于创建对象系统自动调用,也可调用构造函数创建无名对象(C++之构造函数,拷贝构造,析构函数再剖析时会提到)
默认构造函数:
1:无参数的空函数定义为
<类名> :: <默认构造函数名> ()
{ }
2: 名字与类名相同,不能重载。
3:在定义一个没给初值的对象时,系统会自动调用默认拷贝构造函数,如果该对象是外部的或者静态的,它的所有数据成员会初始化为0,如果是动态的,则值毫无意义。
析构函数:
1:成员函数,函数体可在体内或体外。
2:没有参数,不能重载,一个类只能定义一个析构函数。
3:与构造函数作用相反 函数名为 ~构造函数名。