第4章类和对象(二)



《第4章类和对象(二)》由会员分享,可在线阅读,更多相关《第4章类和对象(二)(97页珍藏版)》请在文档大全上搜索。
1、1第二部分第二部分 面向对象的程序设计面向对象的程序设计 第第3章类和对象章类和对象(一一)第第4章类和对象章类和对象(二二)第第5章继承和派生章继承和派生第第6章虚函数与多态性章虚函数与多态性第第7章运算符重载章运算符重载第第8章模板章模板第第9章标准模板库章标准模板库STL第第10章章 C+语言的输入和输出语言的输入和输出2第第4章类和对象章类和对象(二二)本章要点:本章要点:v对象数组与对象指针。对象数组与对象指针。 v类的静态成员:静态数据成员与静态成员函数。类的静态成员:静态数据成员与静态成员函数。 v友元有友元有3种形式:友元函数、友元成员和友元类。种形式:友元函数、友元成员和友元
2、类。 v常对象:常数据成员与常成员函数。常对象:常数据成员与常成员函数。 34.1 自引用指针自引用指针this v对象的自身引用是面向对象程序设计语言中特有的、十分对象的自身引用是面向对象程序设计语言中特有的、十分重要的一种机制。在重要的一种机制。在C+中,为这种机制设立了专门的表中,为这种机制设立了专门的表示:示:this指针变量指针变量。vThis指针是一个隐含于每个类的成员函数中的特殊指针。指针是一个隐含于每个类的成员函数中的特殊指针。v例如用例如用Clock类,定义两个对象类,定义两个对象,分别调用成员函数分别调用成员函数SetTime(int Nh, int Nm, int Ns
3、): Clock c1,c2; c1.SetTime(10,20,0); c2.SetTime(6,10,20);v 二个对象调用的成员函数是同一代码,并在成员函数中二个对象调用的成员函数是同一代码,并在成员函数中都为数据成员赋值,那么成员函数如何识别数据成员是属都为数据成员赋值,那么成员函数如何识别数据成员是属于哪个对象呢?于哪个对象呢?4v实际上在执行实际上在执行c1.SetTime(10,20,0);时,成员函数时,成员函数SetTime除了接收除了接收3个实参外,还接受了个实参外,还接受了c1对象的地址,这个地对象的地址,这个地址被一个隐含的址被一个隐含的this指针所获取,等同于执行
4、了指针所获取,等同于执行了this=&c1, 所以所有对数据成员的访问,都隐含地加上所以所有对数据成员的访问,都隐含地加上前缀前缀 this-v即在即在SetTime函数代码中,执行为私有数据赋值函数代码中,执行为私有数据赋值,v等同于执行了:等同于执行了:this-hour=Nh; v this-minute=Nm; this-second=Ns;v从而确保了不同对象调用成员函数时访问的是不同对象从而确保了不同对象调用成员函数时访问的是不同对象的数据,且它们之间没有干扰。的数据,且它们之间没有干扰。v在类的每一个成员函数的形参表中都有一个隐含的指针在类的每一个成员函数的形参表中都有一个隐含的
5、指针变量变量this,该指针变量的类型就是成员函数所属类的该指针变量的类型就是成员函数所属类的类型。类型。v当程序中调用类的成员函数时,当程序中调用类的成员函数时,this指针变量被自动指针变量被自动初始化为发出函数调用的初始化为发出函数调用的对象的地址对象的地址。5【例【例4.1】this指针的使用。指针的使用。 /* 04_01.cpp */#include using namespace std;class Sampleprivate:int x, y; public:Sample(int a=0, int b=0) x=a; y=b; void print() coutxendl; c
6、outyendl;int main() Sample obj(5,10); obj.print(); return 0;成员函数中隐含着一个指成员函数中隐含着一个指针针this,它指向调用成员它指向调用成员函数的对象,在成员函数函数的对象,在成员函数中可以直接使用该指针。中可以直接使用该指针。 6上述程序可用上述程序可用this指针指针显示改写为完全等价的形式:显示改写为完全等价的形式: #include using namespace std;class Sampleint x, y;public:Sample(int a=0, int b=0) this-x=a; this-y=b; /在
7、此例中在此例中this=&objvoid print() coutxendl; /在此例中在此例中this=&obj coutyx = x; 成员成员非成员非成员8另一种使用另一种使用this指针的应用是一个类的函数需要返回当前对象的引用指针的应用是一个类的函数需要返回当前对象的引用:例如:例如:class Sample private: int x;char* ptr; public:Sample & Set(int i, char *p); /.;Sample& Sample:Set(int i, char *p); x=i; ptr=p; return *this;函数函数Set返回当前
8、对象的引用,返回当前对象的引用,*this就是当前对象就是当前对象。94.2 对象数组与对象指针对象数组与对象指针 4.2.1 对象数组对象数组 v对于类的对象,也可以建立数组,即对象数组。对于类的对象,也可以建立数组,即对象数组。v对象数组的每个元素都是对象,都有自己的数对象数组的每个元素都是对象,都有自己的数据成员,和函数成员。据成员,和函数成员。v声明对象数组声明对象数组:类名类名 数组名数组名常量表达式常量表达式;v例:声明例:声明Clock类的对象数组:类的对象数组: Clock C2;v使用对象数组元素使用对象数组元素: 元素元素 . 成员名成员名v例:例: C0.SetTime(
9、10,30,10);v C0.ShowTime();10定义对象数组时,系统定义对象数组时,系统为每个数组元素对象调用一次为每个数组元素对象调用一次构造函数构造函数以构造这些元素。以构造这些元素。例如:例如:Student stu3; 定义了定义了Student类的对象数组类的对象数组stu,含有,含有3 3个元素:个元素: stu0stu0、 stu1stu1、 stu2stu2 系统系统3次调用默认的构造函数次调用默认的构造函数, ,建立建立3 3个元素。个元素。对象数组的初始化过程就是对象数组的初始化过程就是调用构造函数对每个元素调用构造函数对每个元素对象进行初始化的过程对象进行初始化的
10、过程。 11v假设类假设类Student有有2个数据成员个数据成员: 姓名姓名(char name10)、年年龄龄(int age),在定义对象数组时也可以实现初始化。在定义对象数组时也可以实现初始化。v在声明数组时给每个元素指定初值,在声明数组时给每个元素指定初值,会调用会调用与形参类型与形参类型相匹配的相匹配的构造函数构造函数。例如:例如: Student stu3=Student(“zhao”,22), Student(“qian”,20) ;在建立对象数组时,在建立对象数组时,2 2次调用次调用带形参的构造函数带形参的构造函数分别初始化分别初始化stu0、stu1, 调用调用无形参的构
11、造函数无形参的构造函数建立建立stu2元素。元素。v与基本数据类型的数组一样,在使用对象数组时也只能与基本数据类型的数组一样,在使用对象数组时也只能访问某个数组元素(也就是一个对象),通过这个对象,访问某个数组元素(也就是一个对象),通过这个对象,可以访问到它的公有成员,一般形式是:可以访问到它的公有成员,一般形式是: 数组名下标数组名下标. 成员名成员名12【例【例4.2】对象数组的应用。】对象数组的应用。 /* 04_02.cpp */#include using namespace std;class Sampleprivate: int x;public: void Set_x(int