面向对象程序设计第二节(2020-01-26)

这一节来解释一下上一节中存在的几个问题:

1.构造函数

首先,什么叫做构造函数?类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数,那么为什么需要构造函数?我们在编写完一个类之后,这个类会具有一些基本成员变量来表征这个类,例如第一节Ticket类的price、balance、total,在实例化一个对象之后,如果我们不初始化它们就开始使用它们,这种行为是危险的,因为我们不知道它们的初始值,直接对它们进行操作的话可能会产生一些无法预计的结果,而这些结果往往不是我们想要的,如果对这些值进行了初始化,程序才能正确正常的运行,这表示这些程序的正确性依赖于程序员的个人修养(即是否具有初始化的习惯),这也是非常危险的,那么c++为了尽量减少因未初始化而产生的错误,制定了一种机制,即构造函数的产生,它们(构造函数可以有多个)在对象被创建时调用,如果程序员没有显示的对对象进行初始化且没有声明构造函数的话,编译器将会自动地生成默认构造函数,成为合成的默认构造函数,合成的默认构造函数有如下规则初始化类的数据成员:
1.如果存在类内的初始值,用它来初始化。
2.否则,默认初始化。

这里再提一下默认初始化,如果定义变量时没有指定初始值,则该变量将被默认初始化(default initialized),默认值由变量类型及定义该变量的位置有关,如果时内置类型的变量没有显示初始化,它的值将由定义的位置决定。定义于任何函数之外的变量被初始化为0,即存放再堆区中的变量,定义在函数体内的内置类型变量将不被初始化,访问未初始化的内置类型变量的值是未定义的行为,所以,建议初始化每一个内置类型的变量。

当然,合成的默认构造函数只适用于非常简单的类,当我们编写类时,最好还是自己写构造函数!

2.析构函数

析构函数与构造函数是配套使用的,他在对象生命周期结束后自动调用,释放掉分配的空间,我们知道,函数中的非静态成员在函数调用结束后,会调用该函数的析构函数来释放空间,如果用new来申请一个动态对象,用delete释放该对象时才能调用析构函数,如果不使用delete,会造成内存泄漏(后续会进行补充),所以,如果我们编写的类在调用构造函数或在该类生命周期中没有动态申请内存,一般我们的析构函数都不需要显示编写,编译器会为我们的类生成一个析构函数,称作合成的析构函数,它按照对象创建时的逆序来释放非静态成员。

3.struct vs class

我们知道,在C语言中,struct是定义结构体的关键字,内部不能定义函数,在c++中,struct可以来定义类,它与class的唯一区别就是默认的访问权限不一样,struct的默认访问权限是public,class的默认访问权限是private。

你可能感兴趣的:(面向对象程序设计第二节(2020-01-26))