类的6个默认成员函数
如果一个类中什么成员都没有,简称为空类。
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数
:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
class Date {};
构造函数
构造函数是一个特殊的成员函数
,名字与类名相同,创建类
类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次
特征:
- 函数的名字和类的名字相同。
- 构造函数没有返回值。(甚至连void都不用写)
- 当对象实例化时,构造函数会自动初始化对应的对象
- 构造函数可以重载。(我们可以写多个构造函数,提供多种初始化的方式)
不带参数的构造函数
#include<iostream>
using namespace std;
class Date
{
public:
//来,我们来写一个日期类的构造函数
Date() // 函数名和类名相同。没有返回值,连void都不用写,我们先写一个无参数的
{
cout << "Date()" << endl;
_year = 1;
_month = 1;
_day = 1;
}
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d;
d.Print();
return 0;
}
写好了构造函数,它就会自动帮我们初始化,看看结果:
如果不写构成函数的运行结果是:
带参数的构造函数
#include<iostream>
using namespace std;
class Date
{
public:
//来,这次我们写个带参数的构造函数。
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
//c++中我们把变量叫做对象。
//比如变量d2,我们叫做对象d2.
//注意看,如果在c语言中我们传参,是把参数放在相应函数的括号里的,但是,这里是把参数放在对象后面的。
Date d2(2023, 7, 20);
d2.Print();
return 0;
}
构造函数也是默认成员函数,我们不写的话,编译器会自动生成。
编译器生成的默认构造函数的特点:
- 我们不写才会生成,我们写了任意一个构造函数就不会生成了。
- 内置类型的成员不会处理(c++11,声明支持给缺省值)。
- 自定义类型的成员才会处理,回去调用这个成员的构造函数。
总结:一般情况下都需要我们自己写构造函数,决定初始化的方式,成员变量全是自定义类型,可以考虑不写构造函数(因为这个时候编译器会自动生成构造函数)。
默认构造函数就是我们不传参,它自己会调用的函数就叫默认构造函数,默认构造函数包括我们自己写的无参的构造函数 全缺省的构造函数 编译器默认生成的构造函数。但是以上三种函数只能存在一个如果多个存在的话,则会存在调用二义性