类中有六个默认构造函数,本文将讲解其中一个:用于初始化的构造函数
1.构造函数
1.1概念
对于Date类,一般可以通过 Init 公有方法给对象设置日期
代码:
class Date
{
public:
//初始化
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
//打印
void print()
{
cout << _year<<'/'<<_month<<'/'<<_day << endl;
}
private:
int _year;
int _month;
int _day;
};
但如果每次创建对象时都调用该方法设置 信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?
这时,就需要用到构造函数
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
代码:
class Date
{
public:
//构造函数
//1.函数名和类名相同
//2.没有返回值
//3.对象实例化时自动调用
Date()
{
_year = 1;
_month = 1;
_day = 1;
}
void print()
{
cout << _year<<'/'<<_month<<'/'<<_day << endl;
}
private:
int _year;
int _month;
int _day;
};
1.2特性
支持函数重载
代码:
class Date
{
public:
Date()
{
_year = 1;
_month = 1;
_day = 1;
}
Date(int year, int month, int day)//4.支持函数重载
{
_year = year;
_month = month;
_day = day;
}
void print()
{
cout << _year<<'/'<<_month<<'/'<<_day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
//我们可以这样来调用构造函数,进行初始化。
Date d1;
Date d2(2023,7,23);
return 0;
}
甚至,我们可以将这两个构造函数合并,利用缺省参数来进行合并
例:
class Date
{
public:
//Date()
//{
// _year = 1;
// _month = 1;
// _day = 1;
//}
//Date(int year, int month, int day)//4.支持函数重载
//{
// _year = year;
// _month = month;
// _day = day;
//}
//合并:
Date(int year = 1, int month = 1, int day =1)
{
_year = year;
_month = month;
_day = day;
}
void print()
{
cout << _year<<'/'<<_month<<'/'<<_day << endl;
}
private:
int _year;
int _month;
int _day;
};
默认构造
自动生成
如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦 用户显式定义编译器将不再生成。
也就是说,我们不写编译器会默认生成一个,来初始化。写了,就不会生成。
C++中类是一定会去调用构造函数的。
如何证明,默认构造的存在呢?
例:
内置类型不初始化,只初始化自定义类型
内置类型不处理
例:
class Date
{
public:
void print()
{
cout << _year<<'/'<<_month<<'/'<<_day << endl;
}
private:
//2.内置类型不作初始化处理
int _year ;
int _month ;
int _day ;
};
int main()
{
Date d1;
d1.print();
return 0;
}
全是随机值,没有进行处理。
自定义类型才会处理,会去调用这个自定义类型成员的默认构造函数!!!
例:
class Stack
{
public:
//构造函数
Stack(int n = 4 )
{
cout << "Stack(int n = 4)" << endl;//证明被调用,随便写的。
}
private:
int* _a;
int _top;
int _capacity;
};
class MYQueue
{
//默认构造函数被调用
public:
//初始化,下面两个自定义类型
Stack _pushstack;//如何初始化?
Stack _popstack;//调用此自定义类型中的默认构造函数,完成初始化。
};
int main()
{
MYQueue q;
return 0;
}
不传参的构造函数都是默认构造函数
默认构造包括:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数
并且默认构造函数只能有一个。
例:
class Date
{
public:
//无参构造函数
Date()
{
_year = 1900;
_month = 1;
_day = 1;
}
//全缺省构造函数
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
// 以下测试函数能通过编译吗?
int main()
{
Date d1;
return 0;
}
总结:
默认构造函数:类必须有构造函数
我们不写,编译器会自动生成
特性:
1.不定义构造函数,自动生成默认构造函数;定义,不生成
2.内置类型不作初始化处理
//指针都是内置类型
3.自定义类型才会处理,会去调用这个自定义类型成员的默认构造函数!!!
总结:一般情况下,都要写构造函数,来自主初始化
但是,当成员变量都是自定义类型时,可以不写。