概念:
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次
需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任 务并不是开空间创建对象,而是初始化对象。
特征:
1. 函数名与类名相同。
2. 无返回值。
3. 对象实例化时编译器自动调用对应的构造函数。
4. 构造函数可以重载。
5.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦 用户显式定义编译器将不再生成
函数重载
无参的构造函数:
注意,写法上的一些问题,若构造函数是一个无参的,那么在主函数部分定义构造函数时,和定义类的方法一致,但若是有参数的,则要如下图所示:
全缺省构造函数:
以及全缺省和无参可以同时存在,但是不建议这么做,因为当想要全部使用缺少参数时,会出现错误!一般情况下都建议写全缺省的构造函数!!!!!!
默认构造函数
默认的构造函数总共有三种:全缺省构造函数,无参数构造函数,因为没有构造函数编译器自己生成的构造函数。
三种构造函数的关系其实是互斥的。
需要注意的是,没有写全缺省构造、无参构造时,写了一个有参但不是全省的构造时,就没有了默认构造 ,就如下图所示:
这种情况下,在定义构造函数时,一定要加上内部的参数,否则会报错!
特点:
在不写构造函数的时候,定义了一个构造函数的对象,同时编译器会自动生成一个默认的构造函数,同时调用了使用对象调用 成员函数 而得到的反馈缺是一堆随机值,就如下图的代码所示。
其实这和构造函数的特性有关,编译器默认生成的构造函数并不会对内置类型(int、double等)的数值进行赋予默认值,而是赋予一堆乱码,而对于自定义类型(class、struct等)的数值则会调用这些自定义类型数组内部的构造函数来赋予总共数值默认值。
就如上面代码所示,图中没有构造函数的出现,编译器自己生成了一个构造函数,而后主函数内定义了一个构造函数 对象 d1 ,d1调用了成员函数 print ,而print 内部的内置类型函数,被编译器生成的默认构造函数赋予了一堆乱七八糟的随机值。
而如果需要避免被编译器生成的默认构造函数赋予随机值,我们需要在内置的成员变量上下手
需要注意的是,成员变量虽然被附上了值,但这里仍然是一个声明,且不开辟空间
//自定义类型 time
class Time
{
public:
// 没有默认构造函数
Time(int hour)
{
cout << "Time()" << endl;
_hour = 0;
_minute = 0;
_second = 0;
}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
private:
// 基本类型(内置类型)
int _year;
int _month;
int _day;
// 自定义类型 --会调用Time 的默认构造函数
Time _t;
};
int main()
{
Date d;//因为Time没有默认构造函数所以会出错!
return 0;
}
如上代码告诉我们,自定义类型内部可能没有默认构造函数,但是如果自定义类型里面的默认构造函数还有自定义类型,那就需要去 那个自定义类型内部寻找默认构造函数。