C++构造函数是类的一个默认成员函数,构造函数函数名与类名一致,无返回值,但是不用显示地在前面写上void,构造函数是起到初始化的作用。构造函数具有许多特性,构造函数可以无参,也可以有参数。无参的或者全缺省的构造函数称为默认构造。如果我们不自己定义构造函数,编译器就会自动生成一个默认构造。如果我们自己写了构造函数(带参数的),编译器就不会自动生成构造函数了。
对于初始化的几种形式:以日期类为例
1、编译器默认生成构造函数
class Date
{
public:
private:
int _year;
int _month;
int _day;
};
这种情形就是编译器默认生成一个构造函数,但是默认生成的构造函数不会对成员变量初始化。
2、由我们自己写一个默认构造函数,但是函数无参
class Date
{
public:
Date()
{
}
private:
int _year;
int _month;
int _day;
};
这种也是一种构造函数。
3、全缺省的构造函数
class Date
{
public:
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
这3中在类实例化的时候,就可以不用传参。比如说:
int main()
{
Date d1;
return 0;
}
4、在声明成员变量的时候就给缺省值
class Date
{
public:
private:
int _year = 1;
int _month = 1;
int _day = 1;
};
这里构造函数也可以写上
5、在声明成员变量的时候给缺省值,同时写全缺省的构造函数
class Date
{
public:
Date(int year = 2024, int month = 4, int day = 3)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year = 1;
int _month = 1;
int _day = 1;
};
这个时候,成员变量初始化的值要么是全缺省的构造函数的形参值,要么是实例化的时候手动输入的值。
构造函数还有初始化列表
class Date
{
public:
Date()
:_year(0),
_month(0),
_day(0)
{
}
private:
int _year;
int _month;
int _day;
};
在构造函数后面紧跟着一个冒号,初始化的值用圆括号写在成员变量后,用逗号分隔。初始化列表无论写不写,编译器都会走一遍,区别在于不手动写的话,就是随机值,手动写了就用你写的值。通常来说建议成员变量都规范到初始化列表进行初始化。
关于初始化还有许多复杂的知识,比如:const修饰的成员变量如何初始化?引用成员变量如何初始化?没有默认构造的类成员变量如何初始化?