类的默认成员函数
类的六个默认成员函数
当一个类中什么成员都没有时被称为空类。
空类:即任何类在什么都不写时,编译器会自动生成6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。
构造函数
构造函数的概念
class Data
{
public:
void Init(int year = 2000, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main(void)
{
Data d1;
d1.Init();
d1.Print();
Data d2;
d2.Init(2024,6,8);
d2.Print();
return 0;
}
每次创建代码时,都需有初始化代码,使得工作量加大,引入构造函数可以进行初始化工作。
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象的整个生命周期内只使用一次。
构造函数的特性
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
其特征如下:
1.函数名与类名相同
2.无返回值(也不需要写void)
3.对象实例化时编译器会自动调用对应的构造函数
class Data
{
public:
Data(int year = 2000, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main(void)
{
Data d1();
return 0;
}
4.构造函数可以重载
class Data
{
public:
//带参数的构造函数
Data(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
//不带参数的构造函数
Data()
{
_year = 2000;
_month = 1;
_day = 1;
}
private:
int _year;
int _month;
int _day;
};
int main(void)
{
//调用带参数的构造函数
Data d1(2024,6,8);
//调用不带参数的构造函数
Data d2;
return 0;
}
构造函数支持重载的原因是:可以存在不同的初始化情况。
【注意】如果公共无参构造函数创建对象时,对象后面不用接括号,否则会变成函数声明。
5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户定义编译器将不再生成。
class Data
{
public:
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main(void)
{
Data d1;
d1.Print();
return 0;
}
编译器默认初始化成随机值:
这里需要说明一下:
C++里将类型分成俩类:
1.内置类型
内置类型属于基本类型,是语言本身定义的基础类型,例如int、char、double、指针等等
2.自定义类型
用struct、calss等定义的类型
编译器自动默认生成构造函数,内置类型不做处理,自定义类型会去调用其默认构造。(这里需要注意的是,不同的编译器有不同的处理方法,有些编译器也会处理,但是至少部分编译器个性化处理,不是所有的编译器都会处理)
总结:
1.一般情况下,有内置类型成员的,就需要自己写构造函数,不能让编译器自己生成
2.全部都是自定义类型成员,可以考虑让编译器自己生成。(一个经典的算法题:使用俩个栈实现队列就可以使用默认构造函数)
6.C++11中,在成员声明的时候可以给缺省值
class Data
{
public:
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year = 2000;
int _month = 1;
int _day = 1;
};
【注意】这里不是初始化
由于这里只能存在成员变量的声明,没有开空间,这里给的是默认的缺省值,给编译器生成默认构造函数用。
7.无参的构造函数和全缺省的构造函数都称为默认构造函数、并且默认构造函数只能有一个。
【注意】无参构造函数、全缺省默认构造函数、如果我们自己没写,编译器默认生成的构造函数都可以认为是默认构造函数。
class Data
{
public:
//无参构造函数
Data()
{
_year = 2000;
_month = 1;
_day = 1;
}
//全参构造函数
Data(int year = 2000,int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main(void)
{
Data d1;
return 0;
}
不传参就可以调用的就是默认构造函数。
析构函数
析构函数的概念
析构函数是特殊的成员函数,析构函数与构造函数的功能相反,析构函数不是完全对对象本身的销毁,局部对象销毁工作时编译器完成的,而对象在销毁时会自动调用析构函数完成对象中资源的清理工作。
析构函数的特性
1.析构函数名实在类名前面加上字符~
2.无参数无返回值
class Data
{