构造函数是用于初始化对象的特殊成员函数,构造函数只能在类中定义,与普通成员函数的定义,传参,声明都不一样
1.函数名与类名相同
2.无返回值,声明定义不写返回类型
class Date {
public:
//构造函数
Date(int year,int month,int day) {
_year = year;
_month = month;
_day = day;
}
void print() {
printf("%d/%d/%dn", _year, _month, _day);
}
private:
int _year;
int _month;
int _day;
};
3.支持重载,缺省参数;
4.“默认构造函数”与“非默认构造函数”
默认构造函数:不需要传参的构造函数(编译器自动生成的(第七点讲),显示定义的全缺省形参,无形参)
//默认构造函数
Date(int year=2022, int month=5, int day=20) {
_year = year;
_month = month;
_day = day;
}
非默认构造函数:需要手动传参的(半缺省,不缺省)
//非默认构造函数
Date(int year,int month,int day) {
_year = year;
_month = month;
_day = day;
}
5.在类实例化时必须调用一个构造函数,调用非默认构造函数的语法为:类名+()这个括号是指调用函数的运算符。
Date test(2022, 5, 20);
实例化对象时不加“()” 编译器便会自动隐式调用默认“构造函数”
Date test;
6.一旦没有成功调用构造函数,编译器会报错,常见的情况有
加了括号但是不存在合适的“非默认构造函数”,或者时没加括号但是没有“默认构造函数”。
错误样例:
class Date {
public:
全缺省的默认构造函数
Date(int year=2022, int month=5, int day=20) {
_year = year;
_month = month;
_day = day;
}
void print() {
printf("%d/%d/%dn", _year, _month, _day);
}
private:
int _year;
int _month;
int _day;
};
int main() {
Date test();选择调用非默认构造函数
/正确写法为:Date test;
return 0;
}
小总结:在实例化对象时,必须调用构造函数,且只能在调用“默认构造函数”与“非默认构造函数”中选择,若调用失败则会报错。
7.若不显示定义,编译器会自动隐形一个“默认构造函数”,一旦有显示定义的构造函数,便不会再自动生成。
这个隐式生成的构造函数 对内置成员变量不做处理,对于自定义类型的成员变量,会调用它(们)的“默认构造函数”这段代码中 test会调用自动生成的构造函数,对于年月日(都是内置成员)不会处理,_year,_month,_day会是随机值对于ma 会调用它的构造函数将ma.a的值会被初始化0。
class A {
A(int val = 0) {
a = val;
}
public:
int a;
};
class Date {
public:
//默认构造函数
Date(int year=2022, int month=5, int day=20) {
_year = year;
_month = month;
_day = day;
}
void print() {
printf("%d/%d/%dn", _year, _month, _day);
}
private:
int _year;
int _month;
int _day;
A ma;
};
int main() {
Date test;
return 0;
}
end.



