在我们学习C++的过程中,我们难免会遇到类,在类中有6个默认的函数,它们分别为:构造函数、拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载,那么我今天直介绍其中的构造函数。
构造函数:
1、什么是构造函数?
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只调用一次,保证每个数据成员都有一个合适的初始值。
2、构造函数的代码表示:
class CDate
{
public:
//不带参数的构造函数
CDate()
{}
//带参数的构造函数
CDate(const int year, const int month, const int day)
{
_iYear = year;
_iMonth = month;
_iDay = day;
}
private:
int _iYear;
int _iMonth;
int _iDay;
};
3、构造函数特性:
(1)、函数名与类名相同。
(2)、没有返回值。
(3)、有初始化列表(可以不用)。
(4)、新对象被创建,由编译器自动调用,且在对象的生命期内仅调用次。
(5)、构造函数可以重载,实参决定了调用哪个构造函数。
(6)、如果没有显式定义时,编译器会提供一个默认的构造函数。
(7)、无参构造函数和带有缺省值得构造函数都认为是缺省构造函数,并且缺省构造函数只能有一个。
(8)、构造函数不能用const来修饰。
4、构造函数的作用:
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟一个放在圆括号中的初始化式。
CDate(int year,int month,int day)
:_iYear(year)
,_iMonth(month)
,_iDay(day)
{
}
注意:
1、每个成员在初始化列表中只能出现一次。
2、初始化列表仅用于初始化类的数据成员,并不指定这些数据成员的初始化顺序,数据成员在类中定义顺序就是在参数列表中的初始化顺序。
3、尽量避免使用成员初始化成员,成员的初始化顺序最好和成员的定义顺序保持一致。
类中包含以下成员必须要放在初始化列表中初始化:
1、引用数据成员
2、const数据成员
3、类类型成员(有构造函数,但不是缺省的构造函数)
CDate(int year,int month,int day,int a,int b)
:_iYear(year)
,_iMonth(month)
,_iDay(day)
,_a(a)//引用变量初始化
, _b(b)//const修饰的变量初始化
{
}
private:
int _iYear;
int _iMonth;
int _iDay;
int &_a;//引用变量定义
const int _b;//const修饰的变量
默认构造函数:
类如果没有显式定义构造函数时,编译器会合成一个默认的构造函数,该构造函数中什么工作都不做。只要显式定义了,即使该构造函数什么也不做,编译器也不会为该类合成默认的构造函数。编译器生成的默认构造函数使用与成员变量初始化相同的规则来初始化成员,具有类类型的成员通过运行各自的默认构造函数来进行初始化。内置和复合类型的成员如指针、数组,只对定义在全局作用域中的对象初始化,当对象定义在局部作用域时,内置和符合类型的成员不进行初始化。在某些情况下,默认构造函数是由编译器隐式使用的。