
C++程序设计基础教学课件作者安志远第2章类和对象.ppt
37页1,第2章 类与对象,2,学习目标,掌握类与对象的基本概念 熟练掌握类的各种形式构造函数的使用 掌握类的析构函数的使用 理解并掌握this指针的使用 掌握常类型的使用,3,2.1 定义类和对象,2.1.1 定义类和对象 2.1.2 访问对象成员 2.1.3 this指针,4,2.1 定义类和对象,在面向对象的程序设计中,最基本的概念是类和对象,类的基本特征有:封装性、继承性、多态性类是实现抽象数据类型的工具,是对某一类具有相同属性和行为特征(数据成员和成员函数)对象的抽象,类实现了一种共享机制,此类所有对象共享类提供的操作对象是类的实例,类和对象紧密相关5,2.1.1 定义类和对象,类的定义 class { public: //公有数据成员和成员函数的定义 private: //私有数据成员和成员函数的定义 protected: //保护数据成员和成员函数的定义 }; ,6,2.1.1 定义类和对象,说明: (1)class:定义类的关键字 (2):定义类的标识符,符合C++标识符的命名规则 (3)从访问权限上分,类的成员分为:公有(public)成员、私有(private)成员和保护(protected)成员三类。
关键字public,private和protected被称为访问权限修饰符或访问控制修饰符 (4):类定义中成员函数具体功能的实现部分,这部分包含所有在类体内说明函数的具体功能7,2.1.1 定义类和对象,对象 类的对象就是具有该类类型的某一特定实体,也是该类类型的一个变量声明一个对象后,编译器为每个对象的数据成员分配内存空间对象没有成员函数的副本,成员函数可以被对象调用 对象的定义 ;,8,2.1.2 访问对象成员,对象的公有成员使用成员操作符“.”访问 格式: . 或者 . 例: t1.PrintMilitary(); t2.PrintStandard();,9,2.1.3 this指针,this指针是一个指向对象的指针,隐含在类的成员函数中,用来指向成员函数所属类的正在被操作的对象 当一个对象的成员函数被调用时,系统会自动向它传递一个隐含的参数,即一个指向正被该函数操作的对象的指针,程序中使用关键字this来引用该指针 当一个成员函数对数据成员进行操作时,用this指针来表示数据成员所在的对象当程序操作不同对象的成员函数时,this指针也指向不同的对象 例: coutmendl;,10,2.2 构造函数,2.2.1 构造函数的定义 2.2.2 带参数的构造函数 2.2.3 重载构造函数 2.2.4 复制构造函数,11,2.2 构造函数,构造函数:是一个特殊的成员函数,其功能是在创建对象时,使用特定的值给对象的数据成员进行初始化。
构造函数的特点: 名与类名相同 不必指定返回类型 构造函数可以重载 函数体可以写在类体内或类体外 与成员函数一样可以带默认参数 不能直接调用,在创建对象时由系统自动调用,12,2.2.1 构造函数的定义,构造函数的一般语法格式: 类名::类名(参数表) { 函数体; } 在类定义时,未定义一个类的构造函数,则系统会自动生成一个不带参数的缺省构造函数,其格式如下: ::() { },13,2.2.2 带参数的构造函数,作用:创建一个对象时,可以用一些特定的数据初始化对象的数据成员 带参数的构造函数可以使用以下形式对数据进行初始化,构造函数的形式: 构造函数名(形式参数表):数据成员1(参数),…,数据成员n(参数) { } 这种形式称为初始化式构造函数14,2.2.3 重载构造函数,构造函数可以进行重载创建对象时,根据参数的类型、个数、顺序调用相应的构造函数 构造函数可以具有默认参数 在构造函数的声明中,指定函数的默认参数,则在构造函数定义中,就不再需要指定默认参数 在构造函数定义时,指定函数默认参数,则在构造函数的声明中,就再不需要指定默认参数15,2.2.4 复制构造函数,复制初始化构造函数:也是构造函数,它在初始化时用来将已知对象的数据成员的值复制给正在创建的另一个同类的对象。
特点: (1)该函数名与类名相同,因为它也是一种构造函数,并且该函数不被指定返回类型 (2)该函数只有一个参数,并且是对某个对象的引用 (3)每个类都必须有一个复制初始化构造函数16,2.2.4 复制构造函数,复制初始化构造函数格式: ::(const & ) 与该类名相同 Const:一个类型修饰符,被它修饰的对象是一个不能被更新的常量 若类中没有说明复制初始化构造函数,则编译系统自动生成一个具有上述形式的缺省复制初始化构造函数,作为该类的公有成员17,2.2.4 复制构造函数,需要用复制初始化构造函数的三种情况: (1)明确表示由一个对象初始化另一个对象时,使用复制构造函数 (2)当对象作为函数实参传递给函数形参时,使用复制构造函数 (3)当对象用为函数返回值时,调用复制构造函数18,2.3 析构函数,析构函数:一个特殊的成员函数,功能与构造函数相反,当对象被撤销时,释放该对象所占据的存储空间,一般情况下,执行顺序与构造函数相反 特点: 名字与类名相同,在名字前面加上“~”字符 不指定数据类型,也没有参数 一个类中只能定义一个析构函数 是成员函数,函数体可写在类体内或类体外 不能重载。
可以由程序调用,也可以由系统自动调用19,2.3 析构函数,系统自动调用析构函数的三种情况: (1)一个对象被定义在一个函数体内,当这个函数结束时 (2)一个临时的对象不再需要时 (3)一个对象是使用new运算符动态创建的,在使用delete运算符释放它时 调用析构函数的语法格式: 对象名.类名::析构函数名,20,2.3 析构函数,一个类中没有定义析构函数时,编译系统生成一个缺省析构函数,格式: ::~ { } 缺省析构函数也是一个空函数21,2.4 对象的指针和对象的引用,2.4.1 对象的指针 2.4.2 对象引用,22,2.4.1 对象的指针,1. 指向对象的指针变量 创建一个类的对象时,在内存中为该对象分配存储空间,该存储空间的起始地址,称为该对象的指针 可以定义一个指针变量,用来指向一个对象: 类名 *指针变量名;,23,2.4.1 对象的指针,通过指针变量可间接访问对象成员,方式: (*指针变量).数据成员名; (*指针变量).成员函数名(参数表); 注意: “*”的优先级低,必须用圆括号括起来 也可以是用如下方式: 对象的指针名-数据成员名; 对象的指针名-成员函数名(参数表) “-”为成员选择运算符,用于指针变量访问结构体或类中的成员。
使用前先给指针赋一个合法的初值24,2.4.1 对象的指针,2. 对象的指针作为函数的参数 应用广泛可以实现参数值的双向传递,不必为形参变量分配空间,不需要实参和形参对象间值的拷贝25,2.4.2 对象引用,在实际编程中,使用对象的引用作为函数的参数要比使用对象指针作为函数的参数更多一些 使用对象的引用作为函数的参数更能说明对象的引用的直观与简洁26,2.5 对象数组,对象数组:指数组元素为对象的数组其定义、使用与一般类型数组相同 定义格式: []… :要定义对象数组元素所属类的名字 []:数组元素的个数 例如: student s[5]; student ss[2][3];,27,2.5 对象数组,定义对象数组时,对象数组元素类要有无参数的构造函数,或构造函数的所有参数有默任值定义时,系统为每一个数组元素调用一次构造函数来初始化 对象数组可以被初始化不同的值,也可以赋值28,2.6 常类型,2.6.1 常指针和常引用 2.6.2 常成员函数 2.6.3 常数据成员,29,2.6.1 常指针和常引用,1. 常量和常对象 常量:在程序执行过程中其值不能被改变必须对常量进行初始化 常量的定义: const ; 或者 const ; 例如: const int Max=100; int const Min=10;,30,2.6.1 常指针和常引用,常对象的定义: const 或者 const ,31,2.6.1 常指针和常引用,2. 常指针 使用const修饰指针时,有两种含义: 用const限定所指对象为常量,称为指向常量的指针; 用const限定的指针是一个常量,指向的对象可以改变,称为指针常量。
32,2.6.1 常指针和常引用,指向常量的指针定义格式: const 类型 * 指针; 或者 类型 const * 指针; 例如: int i =25,j=66; const int *pi = ,33,2.6.1 常指针和常引用,指针常量定义格式: 类型 * const 指针; 例如: double d1 = 123.456; double *const pd = //错误 },34,2.6.1 常指针和常引用,3. 常引用 使用const限定引用时,该引用为常引用,所引用的对象不能被更改 常引用的定义格式: const //错误,常引用不能被更该,35,2.6.2 常成员函数,常成员函数:使用const说明的成员函数只有常成员函数才有权使用常量或常对象 常成员函数说明的格式为: () const; 函数后面说明的const,是函数的一个组成部分,在函数的定义部分也必须加上const36,2.6.3 常数据成员,由于const修饰的对象不能更改,所以必须进行初始化因此,在类中定义const数据成员时,要通过成员初始化列表的方式来实现构造函数对常数据成员的初始化37,2.7 应用实例,实例1:编写程序,输入5个学生的高等数学、英语和C++程序设计三门课的成绩,按总分从高到低排序。
要显示排序后的结果 实例2:堆栈是一种数据结构,数据按照先进后出的方式进行操作,编写程序实现数据的入栈和出栈操作,要求显示出栈顺序。
