三、类和复杂对象
3.1 对象指针和对象引用作函数参数
3.1.1对象指针作函数参数
优点:
实现传址调用。可在被调用函数中改变调用函数的参数对象的值,实现函数之间的信息传递
使用对象指针实参仅将对象的地址值传递给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时间开销
3.1.2 示例
图3-1 对象指针作函数参数
3.1.3 对象引用作函数参数
优点:
该方法除了具有对象指针作函数参数的优点外,还更简单更直接,应用更广
3.1.4 示例
图3-2 对象引用做函数参数
3.2 this指针
3.2.1 特点
该指针是隐含于每一个类的成员函数中的特殊指针
该指针指向正在被某个成员函数操作的对象
*this标识调用该成员函数的对象
3.2.2 示例
图3-3 this指针
3.3 对象数组
3.3.1 对象数组的定义
<类名> <数组名>[<大小>]... 例如 DATE dates[7];DATE date2[3][5];
3.3.2 对象数组赋初值与赋值
数组元素通过匿名对象赋值,即,DATE xx(1,1,1998);dates[0] = xx(1,1,1998);释放xx
3.3.3 示例
图3-4 对象数组
*3.4 指向数组的指针和指针数组(这一部分不做讲解)
3.4.1 指向数组的指针
<类型说明符> (*<指针名>)[<大小>]...
3.4.2 指针数组
<类型名> * <数组名>)[<大小>]...
3.5 常类型
使用类型修饰符const说明的类型
常类型的变量或对象的值是不能被更新的
定义或说明常类型时必须初始化
const修饰其左边的类型
3.5.1 一般常量(简单类型的常量)
<类型说明符> const <常量名> 或 const <类型说明符> <常量名>
3.5.2 示例
图3-5 一般常量
3.5.3 常对象
<类名> const <对象名>
3.5.4 示例
图3-6 常对象
3.5.5 常指针
图3-7 常指针
3.5.6 常引用
const <类型说明符> & <引用名>
注意!常引用所引用的对象不能被更新,示例见下图
图3-8 常引用
3.5.7 常指针与常引用的作用
使用常参数表明该函数不会更新某个参数所指向或所引用的对象,并使该函数具有更大的适应性
3.5.8 示例
图3-9 常指针与常引用
3.6 常成员函数
使用const关键字进行说明的成员函数
<类型说明符> <函数名>(<参数表>) const
const是函数类型的一个组成部分,在函数实现部分必须带有const关键字
只有常成员函数才能操作常对象
3.6.1 成员函数与对象之间的操作关系
图3-10 成员函数与对象之间的操作关系
3.6.2 示例
图3-11 成员函数与对象之间的操作关系1
图3-12 成员函数与对象之间的操作关系2
3.7 常数据成员
const类型对象必须被初始化,并且不能被更新
常数据成员只能通过成员初始化列表的方法进行初始化
3.7.1 示例
图3-13 常数据成员
3.8 子对象
当一个类的成员是另一个类的对象时,该对象就为子对象
子对象即对象成员
当类中出现了子对象(对象成员)时,该类的构造函数要包含对子对象的初始化,通常采用成员初始化列表的方法来初始化子对象
3.8.1 示例
图3-14 子对象
3.8.2 说明
子对象必须在成员初始化列表中初始化
建立一个对象时,它的所有子对象一起建立
先执行子对象构造函数,再执行对象的构造函数体
析构函数的执行顺序与构造函数的执行顺序严格相反
构造函数的调用顺序仅与子对象在类中声明的顺序有关,而与成员初始化列表中给出的对构造函数的调用顺序无关
构造函数的成员初始化列表中未给出对子对象的调用,则表示使用子对象的缺省构造函数
3.9 堆对象
在程序运行过程中根据需要可以随时建立或删除的对象
堆对象运算符:new、delete
3.9.1 new运算符
动态创建堆对象
格式:new <类型说明符> (<初始值列表>)
new运算符返回一个与new所分配对象类型相匹配的指针
如果new运算符不能分配到所需要的内存,将返回0,这时为空指针
使用new运算符创建对象时,它可以根据其参数来选择适当的构造函数
3.9.2 new创建数组
格式:new <类型名> [<算术表达式>]
例如:A *ptr;ptr=new A[5];
使用new创建对象数组或一般数组时,不能为该数组指定初始值,其初始值为缺省值
使用new[]创建对象数组时,类中必须说明缺省构造函数
3.9.3 delete运算符
删除用new创建的对象或一般类型的指针
格式:delete <指针名>
例如:A *ptr;ptr=new A(5,6);delete ptr;
3.9.4删除对象数组
格式:delete[] <指针名>
例如:A *ptr;ptr=new A[5];delete[] ptr;
注意:必须用于由运算符new返回的指针
该运算符也适用于空指针(即其值为0的指针)
对一个指针只能使用一次delete操作
指针名前只用一对方括号符([]),并且不管所删除数组的维数,忽略方括号内的任何数字
3.9.5 示例
图3-15 动态创建堆对象
图3-16 动态创建对象数组
传送门:1小时深入c++面向对象编程