C++复习2----类与对象
定义类与对象 类的一般定义形式为: class 类名 { 访问属性: 数据成员与成员函数的说明或实现 };
数据成员的定义 数据成员类型1:数据成员列表; 数据成员类型2:数据成员列表; .
成员函数的定义 成员函数的定义由说明和实现两部分。 成员函数的说明是将成员函数在类体内声明,成员函数的实现是在类体外或类体内定义。 类体外定义的格式为: 函数类型 类名::成员函数(<参数列表>) { <函数体>; };
数据成员及函数成员的属性 public ---- 公有访问属性 private ---- 私有访问属性 protected ---- 保护访问属性 其中数据成员的属性默认为private
成员函数在类体内定义,不需声明 class Tdate { private: //数据成员:year,month,day int year; int month; int day; public: //成员函数print()在类体内定义,不需声明 void print() //类体内定义成员函数 print() printf("%d-%d-%d\n",year,month,day); } };
如何定义对象 类相当于一种特殊的数据类型,对象相当于一种特殊的变量。 类是对象的模板,对象是实例化后的类。 类的使用通过对象来实现。 对象的定义形式有两种方式: 方式1: 类名 对象名列表 方式2:class 类名 { ... }对象名列表;
对象的引用 对数据成员的引用: <对象名>.数据成员名 对数据成员的引用: <对象名>.数据成员名 对成员函数的引用: <对象名>.成员函数名<参数列表> 其中的点号.称为成员引用符,指示对象的成员。 <对象名>也可以用指向对象的指针替代,访问格式为: <指向对象的指针>->数据成员 <指向对象的指针>->成员函数名(参数列表) void main() { Tdate ada,*p; //定义对象和指针,类实例化 p=&ada; //从对象获取指向对象的指针 ada.print(); //使用对象 if(p->isLeapYear()) //使用对象 printf("is Leap Year."); }
对象的初始化----构造函数 面向对象程序中声明一个类对象时,编译程序为对象分配存储空间,进行初始化,在C++中,这部分工作由构造函数完成。 构造函数是特殊成员函数,名字与类名同名。当声明一个对象时,程序会自动调用对应类的构造函数,进行对象的初始化。
class Tdate { private: //定义数据成员 int year; int month; int day; public: Tdate() //无参数构造函数,构造函数与类同名 { year=1000;month=1;day=1; } Tdate(int y,int m,int d) //有参数构造函数,构造函数与类同名 { year=y;month=m;day=d; } void print() //类体内定义成员函数 print() { printf("%d-%d-%d\n",year,month,day); } }; void main() Tdate d1,d2(2000,2,2); //定义两个对象,d1和d2 d1.print(); //使用对象d1无参数 d2.print(); //使用对象d2有参数 } 构 造 函 数
析构函数 析构函数是一种特殊的类成员函数,在类对象生命周期结束时由系统自动调用,执行与构造函数相反的操作,一些清理任务,如释放存储空间等。 析构函数的定义: 类名::~析构函数名() { .... }
静态成员 静态成员可以实现多个对象之间的数据共享,不会破坏隐藏原则,保证了安全性。 静态成员在类中包括静态数据成员和静态成员函数。
<数据类型><类名>::<静态数据成员>=<初始值> 静态数据成员放在静态存储区,被同类建立的所有对象共享。 静态数据成员的初始化在类外进行,格式为: <数据类型><类名>::<静态数据成员>=<初始值> 注意:静态数据成员所占空间不会随对象的产生而分配,也不会随对象的消失而回收。
class student { private: static int count; //静态数据成员count public: student() //构造函数 { count++; //静态数据成员count上一次的值不会消失 } void print() { printf("count=%d\n",count); } }; int student::count=0; //在类外进行静态数据成员count的初始化 void main() student stu1,stu2; //实例化成两个对象stu1和stu2 stu1.print(); //使用对象stu1,并通过对象stu1使用成员函数print(),静态数据成员的值保留 stu2.print(); //使用对象stu2,并通过对象stu2使用成员函数print(),接着使用静态数据成员上一次值 } 静 态 数 据 成 员
静态成员函数 静态成员函数不属于一个对象,而属于整个类,可以直接引用静态成员。 对静态函数的引用格式有两种: 第1种: 类名::静态成员函数(参数表); 第2种: 对象.静态成员函数(参数表);
<类名> *<对象指针变量名> 指向对象的指针 类实例化成对象后,系统给对象分配存储空间,可以通过对象的首地址来访问对象。指向对象的指针是存储对象的首地址的变量。 指向对象的指针变量的定义格式: <类名> *<对象指针变量名>
使用指向类成员的指针 类由数据成员和成员函数组成,指向类成员的指针主要有指向类数据成员和类成员函数两种指针。 指向类数据成员指针的格式: (1)定义格式: <类型名><类名>::*<指针名>[=<初值>]; (2)赋值: <指针名>=&<类名>::<数据成员名>; (3)使用: 使用类对象: <对象名>.*<指针名> 使用对象指针: <对象指针名>->*<指针名>
指向成员函数的指针 定义格式:<类型>(<类名>::*<指针名>)(<参数表>); 赋值方法:<指针名>=<类名>::<函数名>; 使用类的对象:<对象名>.*<指针名>)(<参数名>); 使用类的对象指针: (<对象指针名>->*<指针名>)(<参数表>);
使用this指针 一个类中的成员函数在内存中仅有一个拷贝,用这个拷贝可以产生多个对象。
对象数组 对象数组是指数组元素为对象的数组,数组中的元素必须是同一个类的若干个对象。对象数组的元素是对象。 对象数组的定义格式: <类名><数组名>[<大小>] 数组的赋值: 创建一个临时对象,赋值后撤销。 对象数组的引用与普通数组一样。
对象指针数组 对象指针数组是指该数组的元素是指向对象的指针。 对象指针数组的定义格式: <类名>*<数组名>[<大小>]
指向对象数组的指针 指向数组的指针是指向普通类型数组的指针 指向对象数组的指针是指向对象数据类型的数组指针 <类型>(*<指针名>)[(大小)]...; <类名>(*<指针名>)[(大小)]...;
const关键词的使用 使用const关键词来限制对象的成员不被修改 在对象名前面使用const修饰的对象称为常对象 定义的格式: 定义常对象时进行初始化,该对象不能再被更新。 使用const修饰类中的成员 用const说明的数据成员称为常数据成员 用const说明的成员函数称为常成员函数 <类型说明符><函数名>(<参数表>)const