构造函数:
1.概念:
构造函数是一种特殊的成员函数,函数名与类名相同,创建类类型的对象时,由编译器自动调用,在对象的生命周期内,只调用一次,保证每一个数据成员都有一个合适的初始值。
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
2.构造函数的特征:
函数名与类名相同
没有返回值
新对象被创建时,由编译器自动调用,且在对象的声明周期仅调用一次
构造函数可以重载,实参决定了调用哪一个构造函数
无参构造函数和带有缺省值的构造函数都认为是缺省的构造函数,并且缺省的构造函数只能有一个
有初始化列表(可以不用)
如果没有显示定义,编译器会自动合成一个默认的构造函数
构造函数不能用const修饰(构造函数可以进行赋值操作,而const修饰不可修改,所以不能用其修饰)
构造函数不能为虚函数
3.构造函数的作用
(1)构造,初始化对象:
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day) //初始化列表
{ 函数体 }
private:
int _year;
int _month;
int _day;
};
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每一个非静态成员变量后面跟一个放在括号里面的初始值或者表达式
注意:
每个成员在初始化列表只能出现一次
初始化列表仅用于初始化类的数据成员,并不指定这些数据成员的初始化顺序,数据成员在类的定义顺序就是在参数列表的初始化顺序
尽量避免使用成员初始化成员,成员的初始化顺序最好和成员的定义顺序一致
当类中包含以下成员时,一定要放在初始化列表位置进行初始化:
引用成员变量
const成员变量
类类型成员(该类有非缺省构造函数)
(2)对已经创建好的对象进行赋值:
class gzhs
{
public:
gzhs(int a, int b){x = a; y = b;}
void show(){ cout<<x<<","<<y<<endl; }
private:
int x;
int y;
};
int main()
{
gzhs fn(3,4);
fn = gzhs(5,6); //重新赋值
fn.show();
return 0;
}
3.类型转换:
对于单个参数构造函数,可以将其接收参数转化为类类型对象。
用explicit修饰构造函数,抑制由构造函数定义的隐式转换,explicit关键字类内部的构建声明上,在类的定义体外部的定义上不再重复。
拷贝构造函数:
1.概念:
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数我们称之为拷贝构造函数。
拷贝构造函数是特殊的构造函数。
创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
{}
Date(const Date& d)
: _year(d._year)
, _month(d._month)
, _day(day)
{ }
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2018, 4, 18);
Date d2(d1);
return 0;
}
2.拷贝构造函数的特征:
(1)构造函数的重载,构造函数的性质拷贝构造函数均满足
(2)参数必须是类类型引用
(3)如果没有显式定义,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化
3.拷贝构造函数的使用场景:
对象实例化对象
作为函数参数
作为函数返回值