首先我们先引入一个思考的问题 : 空类(没有任何成员变量)真的是什么都没有的嘛 - 其实是有的,任何一个类在我们不写的情况下都是会自动生成6个默认成员函数的 (是特殊的成员函数) --- 记住的是我们可以去自己实现这个默认成员函数
在讲默认成员函数之前 --- 我们得知道空类的大小是1哦可不是0字节哦
这是因为实例化的原因 ,空类也是可以实例化的,但是为了每一个实例化的对象都有独一无二的内存,编译器会给一个空类加入一个字节,这样实例化的
了解完空类的大小,现在介绍学习的空类中的第一个默认成员函数 --- 构造函数
我们得先知道构造函数是做什么的 -- 构造函数可以类似之前的 Init 函数 对实例化对象进行初始化的
首先学习构造函数的基本特征 ------------ >
1.构造函数的函数名与类名相同 -- 如下图我们的构造函数(Data)与类名相同
class Data
{
public:
//构造函数
Data()
{
_year = 2021;
_month = 12;
_day = 11;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
//创建Data对象(实例化)
Data D1;
return 0;
}
2. 无返回值
3.构造函数可以函数重载 ---- 如下代码
Data 构造函数形成了函数重载 特别注意的是我们在调用没有形参的构造函数时
(Data D1) 不能写成 Data D1() 编译器就是这样规定的
class Data
{
public:
//构造函数
Data()
{
_year = 2021;
_month = 12;
_day = 11;
}
Data(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
//在创建类对象时,就调用了构造函数
Data D1;
Data D2(2023, 2, 12);
return 0;
}
那么我们可以将上面两个重载函数 -- 写成一个全缺省的函数 (如下)
Data()
{
_year = 0;
_month = 12;
_day = 5;
}
Data(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
全缺省
Data(int year=2022, int month = 2, int day = 5)
{
_year = year;
_month = month;
_day = day;
}
那当我们没有自定义构造函数时 -- 编译器会自动生成默认参数
如下图 -- 我们通过调试分析当我们没有自定义构造函数时 ,编译器的默认函数也并没有将Data的成员变量初始化
那么我们的编译器默认生成的构造函数 做了上面呢 ?
C++里面把类型分成两类 : 内置类型(基本类型) 、 自定义类型
内置类型 : int /char/double/指针/内置类型数组 等等
自定义数据类型 struct / class 定义的类型
我们不写构造函数 ,编译器默认生成构造函数,但对内置类型不做处理
对于自定义类型成员变量会去调用他的默认构造函数初始化,如果没有自定义构造函数就会调用默认构造函数
class A
{
public:
A()
{
cout << "A()" << endl;
_aa = 1;
}
private:
int _aa;
};
class Data
{
//没有自定义构造函数
public:
private:
//自定义类型 默认构造函数不做处理
int _year;
int _month;
int _day;
//自定义类型 --- 调用它的构造函数
A aa;
};
int main()
{
Data D1;
return 0;
}
调试 -- 通过判断 A 成员变量 _aa 的改变 来判断 D1的默认构造函数对自定义类型变量调用了它的构造函数
到这里 --- 我们也就验证完了当我们没有自定义默认函数时 ,编译器会生成默认构造函数
,而默认函数仅仅对内置和自定义类型变量进行了区分
哪道默认构造函数的作用这么小嘛 ????
且看析构函数