目的:更进一步了解类和对象的概念
⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️
8.1 对象的初始化
1.类中的初始化比较特殊,并不是直接赋值,下面是错误案例❌❌❌
class P
{
int hour=0;//这样是不可以的
int minute=0;
};
所以我们会引进构造函数,尤其重要的构造函数
2.用构造函数实现数据成员的初始化
a:构造函数的定义:是一种特殊的成员函数,用来初始化的,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行
3.注意⚠️—构造函数:
a:构造函数的名字必须与类同名,而不能任意取名,目的是使系统更好以构造函数处理
b:它不具有返回值,因此也没有类型,他的作用只是对对像进行初始化,因此也不需要在定义构造函数时声明类型,这是他和一般函数的重要不同点
c:在建立对象时会自动调用构造函数,在建立对象时系统会为该对象分配单元,每建立一次对象,就调用一次构造函数,下面是错误示范❌❌❌
int Time()//两种都不行
{···}
void Time()
{···}
e:构造函数不需要用户调用,也不能被用户调用,且构造函数一般声明为public,下面是错误示范❌❌❌
t1.Time();
f:可以用一个类对象初始化另一个类对象
Time t1;//建立对象t1,同时调用构造函数
Time t2=t1;//建立对象,并用一个t1初始化t2
g:在构造函数中除赋值语句外,也可以加入其他语句,但是并不提倡,以保持程序清晰
h:如果用户自己没有定义构造函数,系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作
4.带参数的构造函数
a:函数首部形式:构造函数名(类型1 形参1,类型1形参2····)
b:定义形式:类名 对象名(实参1,实参2)
c:两种代码效果是一样
Box::Box(int h,int w,int len)
{
height=h;
width=w;
length=len;
}
Box::Box(int h,int w,int len):height(h),width(w),length(len){}
注意⚠️:如果数据成员是数组,则应当在构造函数的函数体中用语句对其赋值,而不能在参数初始化表中对其初始化
5.参数重载
a:这些构造函数具有相同的名字,而参数的个数或参数的类型不相同,这称为构造函数的重载
6.补充—函数重载
a:在建立对象时不必给出实参的构造函数,则称为默认构造函数
b:一个类只能有一个默认的构造函数,如果用户希望在创造对象时就能使数据成员有初值,就必须自己定义构造函数
d:在建立对象时选用的是无构造函数,在定义对象时要有正确的形式
Box x1();//错误的❌❌❌
Box x1;//正确的
e:如果在一个类中可以包含多个构造函数,建立对象时只执行其中一个构造函数
6.构造函数中可以使用默认参数
a:构造函数中参数的值即可以通过实惨传递,也可以指定为某些默认值,即如果用户不指定参数值,编译系统就使形参取默认值
b:应在声明构造函数时默认值,而不能只在定义构造函数时指定默认值,因为类声明是放在头文件中,它是类的对外接口,用户是可以看到的,而函数的定义是类的实现细节,用户往往是看不到的
c:一个类只能有一个默认构造函数,也就是说,可以不用参数而调用的构造函数,一个类只有一个
6.利用析构函数进行清理工作
a:有4种情况会出现析构函数
(1)如果在一个函数中定义了一个对象,当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数
(2)静态局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数
(3)如果调用new运算符动态的建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数
b:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些“清理”工作
c:析构函数还可以被用来执行用户希望在最后一次使用对象之后所执行的任何操作,
d:析构函数在C++中要用“~”位取反运算符
7.区别构造函数和析构函数的顺序,就是一个口号“先构造的后析构,后构造的先析构”