构造函数是c++类中六个默认成员函数中的一个,主要负责完成初始化工作
1.概念:
构造函数是C++类中一个特殊的成员函数,名字与类名相同,创建类类型对象时编译器自动调用,保证每个数据成员都有一个初始值,并且在对象的生命周期内只调用一次
?2.特性:
- 函数名与类名相同
- 无返回值
- 对象实例化时编译器自动调用对应的构造函数
- 构造函数可以重载
构造函数分为无参构造和带参构造函数(构造函数的重载)
通过无参构造函数创建一个对象时,函数后边不用跟括号,否则就成了函数声明
class Date{
public:
Date(){}//无参构造函数
Date(int year,int month,int day){
//带参构造函数
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _day;
int _month;
};
int main(){
Date d1; //调用无参构造函数
Date d2(2019,9,4); //调用带参构造函数
Date d3(); //成为了函数声明
return 0;
}
- 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
class Date{
public:
// Date(){}//无参构造函数
//
// Date(int year,int month,int day){
// //带参构造函数
// _year = year;
// _month = month;
// _day = day;
// }
private:
int _year;
int _day;
int _month;
};
int main(){
//没有定义构造函数,对象也可以创建成功,因此此处调用的是系统默认生存的构造函数
Date d1;
return 0;
}
- 无参构造函数和全缺省构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写系统默认生成的构造函数都可以称为默认构造函数
class Date{
public:
Date() {
_year = 2019 ;
_month = 9;
_day = 4;
}
Date (int year = 2019, int month = 9, int day = 4){
_year = year;
_month = month;
_day = day;
}
private:
int _year ;
int _month ;
int _day ; };
// 以下测试函数能通过编译吗?
void Test(){
Date d1;
//不能编译通过
}
- 关于编译器生成的默认成员函数,很多童鞋会有疑惑:在我们不实现构造函数的情况下,编译器会生成 默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象year/month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么卵 用??
解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如 int/char…,自定义类型就是我们使用class/struct/union自己定义的类型,看看下面的程序,就会发现 编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数
class Time{
public:
Time() {
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 _t;
};
int main() {
Date d;
return 0;
}
- 成员变量的命名风格
// 我们看看这个函数,是不是很僵硬?
class Date{
public:
Date(int year){
// 这里的year到底是成员变量,还是函数形参?
year = year;
}
private:
int year;
};
// 所以我们一般都建议这样
class Year{
public:
Year(int year){
_year = year;
}
private:
int _year;
};
// 或者这样。
class Day{
public:
Day(int day){
m_day = day;
}
private:
int m_day;
};