文章内容如下:
1)类
2)构造函数
3)析构函数
4)拷贝构造函数
5)初始化列表
6)explicit关键字
7)类的对象数组
一。类
类是具有封装性的结构体。类是class关键词修饰。将具有共性的数据(-声明)和方法(-函数实现)放在一起,加以权限区分,只能通过公共方法访问叫着类的封装性。权限区分指针对类的外部而言的,权限有3种,private(私有),protected(保护),public(公共)。内部没有权限,可以互相访问。对象可以理解为具有内存空间的变量。
成员函数在类里面实现会显得类很臃肿,所以也迫切需要能够在类外实现,C++当然可以提供成员函数在类外实现的。具体操作是:成员函数需要在类中声明,在类外实现
二。构造函数
函数名和类名相同的函数叫构造函数,构造函数没有返回类型,可以有形参。构造函数是用来初始化类的对象。当类实例化对象的时候,系统会自动调用构造函数,并完成对象的初始化,详细的说是先给对象开辟空间,然后再初始化。如果用户不提供构造函数,编译器会自动添加一个默认的构造函数,如果用户定义了构造函数,不论是有参还是无参,编译器都不再提供默认构造函数。
三。析构函数
函数名和类名相同,在函数名前加~的函数叫析构函数,析构函数没有返回类型,没有形参,因为是用来清理工作的,要形参有什么用,而且还是清理完马上就要被释放了,因此也就没有被重载的可能。析构函数是用来清空类中的对象的。当类中的对象生命周期结束时,系统会自动调用析构函数释放该对象空间,详细的说是先调用析构函数清理,再释放对象的空间。
一般情况下,类中有一个空的析构函数就够了,即析构函数里什么内容都不需要写,但是如果一个类中有指针成员,那么这个类必须手写析构函数,释放指针成员所指向的空间,因为析构只会只会释放对象本身的空间,一般情况下对象的空间也只包含它自身的空间,所以当有指针时,指针指向的空间在对象外,这时需要释放指针指向的空间,用默认析构的话释放不了指针指向的空间就算了,还会把对象中指针存的地址给干掉了。
四。拷贝构造函数
拷贝构造函数就是构造函数,只不过是一种特殊的构造函数。在旧对象初始化新对象时才会调用拷贝构造函数,在定义的实例化对象叫新对象,除了这个对象以外的其他对象都叫旧对象。
拷贝构造函数一定是有常引用的,系统默认给的拷贝构造函数是浅拷贝,自己写的拷贝构造函数是深拷贝,一般情况下默认使用系统的拷贝构造函数就可以了,只有当系统的拷贝构造函数出现问题时我们才使用自己写的拷贝构造函数,如类中有指针时,浅拷贝会导致多个指针指向同一块区域,会导致这块内存空间的多次释放,而深拷贝并不会,深拷贝就是让指针成员拥有独立的指向,不让众多对象的指针成员指向同一个空间。
如果用户定义了拷贝构造或者有参构造都会屏蔽系统无参构造。如果用户定义了无参构造或者有参构造不会屏蔽系统拷贝构造。
五。初始化列表
类的有参构造函数后面加冒号跟上对象成员的对象名叫初始化列表。类中的成员是对象,那么这个对象就叫对象成员。说通俗点就是一个类的对象是另一个类的成员,那么这个成员叫做对象成员 。当一个类中有对象成员时,构造与析构的顺序是,先调用对象成员的构造函数,再调用本身的构造函数,析构时是先调用自身的析构函数再调用成员对象的析构函数。调用对象成员的构造函数时系统调用默认调用无参构造,当类想调用对象成员的有参构造时必须使用初始化列表。
六。explicit关键字
explicit的作用是,被explicit声明的构造函数禁止进行隐式转换。explicit的用法就是在构造函数前面加上explicit即可。
七。类的对象数组
类的对象数组 本质上是数组,只是数组里的每一个元素是对象。
创建一个对象数组A arr1[5],就这样的话,那这个数组arr1[5]会默认给每个对象元素进行初始化,用无参构造函数进行初始化,过了作用域会自动调用析构函数为每个对象元素析构,要想调用有参构造,那么必须写成下述这种形式,A arr2[5] = {A(10),A(20),A(30),A(40),A(50)},那么数组arr1[5]会给每个对象元素进行有参构造初始化,过了作用域会自动调用析构函数为每个对象元素析构,具体写法记如下:
A arr1[5];"""其中A表示类,表示创建一个对象数组,数组能装5个类元素"""
A arr2[5] = {A(10),A(20),A(30),A(40),A(50)};"""表示对象数组arr2有5个对象元素"""