以上就是类的六大默认的成员函数,这篇博客主要讲构造函数。剩下的五个成员函数后边会持续更出
构造函数
一.构造函数的定义
构造函数是一个特殊的成员函数,名字和类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只能调用一次,保证每个数据成员都有一个合适的初始值。
class Date
{
public:
//构造函数
Date(int year, int month, int day);
private:
int _year;
int _month;
int _day;
};
Date::Date(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
int main()
{
Date t(1996, 9, 28);
Date t2(2018, 7, 30);
system("pause");
return 0;
}
二.构造函数的特点
- 函数名与类名相同
- 没有返回值
- 新对象被创建时,由编译器自动调用,且在对象的生命周期内仅调用一次
- 构造函数可以重载,实参决定了调用那个构造函数
- 无参构造函数和带有缺省值的构造函数都认为是缺省的构造函数,并且缺省的构造函数只有一个
- 有初始化列表(可以不用)
- 如果没有显式定义时,编译器会合成一个默认的构造函数,值是这个构造函数的函数体是空的,也没有参数,不能进行初始化操作
- 构造函数不能用const修饰
- 构造函数不能为虚函数
- 构造函数不能别用户调用
三.初始化对象
1. 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后边括号里放一个初始化值或者表达式
Date(int year, int month, int day)
:_year(1111)
, _month(22)
, _day(3)
{ }
注意:
- 每个成员在初始化列表中只能出现一次(因为初始化只能一次)
- 初始化列表仅用于初始化类的数据成员,并不指定这些数据成员的初始化顺序,数据成员在类中定义顺序就是在参数列表中初始化的顺序
- 尽量避免用成员初始化成员,成员的初始化顺序最好和成员的定义顺序保持一致
2.类中包含以下成员,一定要放在初始化列表位置进行初始化:
- 引用成员变量
- const成员变量
- 类类型成员(该类有非缺省的构造函数)
3.初始化列表和赋值的区别是什么????
初始化列表只能初始化类中的成员一次
赋值可以进行多次而且可以用this指针
三.构造函数的作用
- 构造和初始化对象
- 类型转换
对于单个参数构造函数,可以将其接受参数转化为类类型对象。用explicit修饰构造函数,抑制有构造函数定义的隐式转换,explicit关键字在类内部的构造声明上,在类的定义体外部的定义上不再重复
构造函数和一般构造函数区别
1 时间不同
1.1 构造函数在对象创建过程中执行,当对象创建完毕,构造函数就结束
1.2 一般函数在对象创建完毕之后,通过对象的引用(对象堆内存地址)来调用,什么时候使用,什么时候调用
2 调用次数不同
2.1 构造函数只要在new对象的时候会被调用,一旦对象创建完成,我们不能手动去调用构造函数
2.2 一般函数可以通过对象随意调用,没有限制
3 互相调用问题
3.1 在构造函数中可以调用一般函数,但是一般函数不能调用构造函数
4 调用方式不同
4.1 构造韩式在创建对象时 ,有JVM自动调用
4.2 一般函数在对象创建时,通过对象调用
5 构造函数没有返回值在声明时也不需要类型,这是和一般函数的主要区别