主要内容:
类
对象
访问控制
构造函数和析构函数
拷贝构造函数 (深拷贝与浅拷贝)
类的构造的基本形式(略)
静态成员
友元
this指针
C++中常类型(略)
类
类的概念:从语言角度来说,类是一种新的数据类型。类是一种具有共性单元之集合。而对于这个人为定义的集合,其属性用数据表示,其行为用函数表示,分别称作类的成员数据与成员函数,二者统一称为类成员。
类的定义:类定义一般分为说明部分(也称作定义部分,类声明)和实现部分。类声明以数据成员描述数据部分,其说明类中成员。实现部分又称类方法定义,是描述了函数的实现方法,即对成员函数的定义。
值得注意的是:类的定义要求在右花括号处,有一个;,不可以省略。这种表现形式与C语言有关。
类的成员函数的实现,需要在每个函数之前,添加一个类的作用域标识符::,这样的表示的动机一是为类的声明和类的实现,建立起链接关系。二是作用域标识符,可以防止出现命名冲突。类似于不同班级的张三站在一起时,以某某班作为定语,以防出现呼叫甲张三而乙张三回应的情况。
对象
对象的概念:对象就是类类型的变量。即集合中的元素,是个体单元。其与类的关系类似于int i中int 与i 的关系。
访问控制
访问控制描述了对类成员访问的权限设置。C++为成员设定三种访问权限:
(1):public (公有类型)
任何用户都可以访问
(2)protected (保护类型)
保护类型,能被本类成员函数,派生类成员函数访问,其他用户无法访问。
(3)private(私有类型)
只允许本类中的函数访问,其他用户不能访问。
构造函数
简介:构造函数的功能是在定义对象时被编译系统自动调用来创建对象并初始化对象。因为如果如同之前int i 的初始化方法,由于数据的访问状态是私有的,程序不能直接访问数据成员,因而需要成员函数来访问数据。这也是当我们没有要求而不显式声明构造函数时,程序会默默建立构造函数的原因。而反之,当我们有需求时,要显式声明构造函数。
特点:
构造函数也是成员函数。
构造函数的函数名与类名相同,且无返回值,它有隐含的返回值,该值由编译系统内部使用。
构造函数可以没有参数,也可以有参数,因此可以重载,即可以定义参数不同的多个构造函数。
程序中不能直接调用构造函数,在定义对象时编译系统自动调用构造函数。
析构函数
简介:用构造函数创建对象后,程序将跟踪该对象直到其过期,而在生存期即将结束时,由于对象即将过期,理应利用某种工具进行清理以释放内存空间。执行该项任务的即为析构函数
特点:
与构造函数一样,析构函数也是类的一个公有成员函数,它的名称是由类名前面加“~”构成,也不指定返回值和声明类型,但与其不同的是,析构函数没有参数,因而无法重载
每个类都必须有一个析构函数。如果构造函数利用new来分配内存,则析构函数要用delete释放空间,而如果类中没有显式定义析构函数,则编译系统自动生成一个缺省形式的析构函数,作为该类的公有成员。
析构函数在对象生存期结束前由编译系统自动调用,用户不可自行调用。
调用构造函数的顺序与创建对象的顺序相同,调用析构函数的顺序与创建对象的顺序相反。
拷贝构造函数
简介:拷贝构造函数也称复制构造函数,是一种特殊的构造函数,它的功能是用一个已知的对象来初始化一个被定义的同类的对象。 类似于利用一个变量对一个同类型的变量进行赋值。
特点:
拷贝构造函数名与类名相同,并且也不指定返回值类型。其只有一个参数,并且是对同类对象的引用。
每个类都必须有一个拷贝构造函数。如果类中没有显式定义拷贝构造函数,则编译系统自动生成一个缺省形式的拷贝构造函数,作为该类的公有成员。
使用场景:
拷贝构造函数在三种情况下由编译系统自动调用。
①当用类的一个对象去初始化该类的另一个对象时,系统自动调用它实现拷贝赋值。
②当对象作为函数的实参传递给函数的形参时
③当函数的返回值是类的对象,函数调用完成返回时。
深拷贝与浅拷贝
在用一个对象初始化另一个对象时,只复制了成员,并没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅拷贝。浅拷贝之概念类似于对一间房屋的门配了多把钥匙,对复制体成员做出改变是会对整个资源做出改变。
深拷贝则是不仅复制了成员,也复制了资源,则为母体与复制体分别指向两个内容相同,但性质不同的堆,对其改变不会影响到其他资源。
C++默认的拷贝构造函数,实现的都是浅拷贝。当我们需要深拷贝时,我们必须手动书写拷贝构造函数,并实现深拷贝。
静态成员
简介:在C++中,静态成员是属于整个类的而不是某个对象,因此其不仅可以被对象调用,也可以被类名调用。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员设计就是解决同一个类的不同对象之间的数据和函数共享问题。
特点:
用关键字static声明
该类的所有对象维护该成员的同一个拷贝
必须进行初始化,用(::)来指明所属的类。
静态成员函数可以直接访问属于该类的静态数据和函数成员,但不能直接调用类中的非静态的数据成员。
友元
简介:C++控制对类私有对象的访问,这种访问控制太过于严格,而影响到编程的方便,于是C++设立了友元这一访问权限,通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息,如私有成员或保护成员。其表现形式就是使用friend前缀修饰。
this指针
一般而言,每个类成员函数都只指向一个对象,即调用它的对象,而当它要指向两个对象时,则需要this指针。而且因为一个对象的this指针并不是指向对象本身的一部分,因而不会影响sizeof(对象)的结果。当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用this指针,通常不显式地使用this指针来引用数据成员。在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。