C++课件 chap5_class1
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
class CClock { int hour,minute,second; public: void SetTime(int h,int m,int s); void ShowTime(); }; class Cdate { int year,month,day; public: void SetDate(int y,int m,int d); int IsLeapYear( ); void print( ); };
对于内联成员函数,编译时在所有调用该函数的地方将装入 对于内联成员函数,编译时在所有调用该函数的地方将装入 实际的函数代码。 实际的函数代码。
上例的实现部分也可放在类内:内联
class Cdate { public: void SetDate(int y,int m,int d) { year=y;month=m;day=d;} int IsLeapYear( ) { return (year%4==0 && year%100!==0)||(year%400==0);} void print( ) { cout<<year<<”.”<<month<<”.”<<day<<endl;} private: int year,month,day; };
也可用关键字 inline 强制定义为内联函数
定义类时应注意的事项
1) 在类内不允许对其数据成员进行初 始化:因为类是一个数据类型, 始化:因为类是一个数据类型,定 义后并没有存储空间, 义后并没有存储空间,因此不能对 数据成员进行初始化( 数据成员进行初始化(但静态数据 成员可在类外进行初始化)。 成员可在类外进行初始化)。
Class Tdate { public: ┇ private: int year=1998,month=4,day=9; //不允许对数据成员进行初始化 };
在C++中,类是一种数据类型,而对象是该类型的变量,变量名 C++中 类是一种数据类型,而对象是该类型的变量, 即是某个具体对象的标识。 即是某个具体对象的标识。
§ 2 类的定义 类是对一组客观对象的抽象,它将该组对象所具有 的共同特征(包括结构特征和行为特征 结构特征和行为特征)进行归纳 结构特征和行为特征 抽象,以说明该组对象的性质和能力 性质和能力。 性质和能力 类是一种用户自定义的新的数据类型,比结构更复 杂。它是将不同类型的数据和与这些相关的操作封 装在一起的集合体。 类的定义一般分为说明部分和实现部分 说明部分和实现部分。说明部分 说明部分和实现部分 用来说明该类中的成员,包括数据成员和成员函数 的说明。成员函数是用来对数据成员进行操作的, 又称为方法。实现部分是用来对成员函数的定义。 使用者关心的往往是说明部分,而实现部分则不必 关心。
类外定义成员函数的实现时,必须在成员函数名前加上所属类名和作用 域操作符“:: ”。 ::
1. 内联函数
内联函数:指在类中定义的函数, 内联函数:指在类中定义的函数,类外定义的 函数缺省情况下都是非内联函数。 函数缺省情况下都是非内联函数。
class CClock { private: int hour,minute,second; public: void SetTime(int h,int m,int s); void ShowTime() //内联函数 内联函数 内联 { cout<<hour<<“:”<<minute<< “:”<< second<<endl; } };
实现部分
例 时间类的定义
class CClock { public: void SetTime(int h,int m,int s); void ShowTime(); //成员函数 成员函数 private: int hour,minute,second; //数据成员 数据成员 }; void CClock::SetTime(int h,int m,int s) //成员函数的定义 成员函数的定义 { hour=h; minute=m; second=s; } void CClock::ShowTime() { cout<<hour<<“:”<<minute<< “:”<< second<<endl; }
§1 类与对象的概念
对于同一种对象,如许多学生对象, 对于同一种对象,如许多学生对象,它们具有相同的结构特征和 行为特征,只是表示内部状态的数据值不同。为了描述这种 行为特征, 相同结构特征和行为特征的对象,面向对象方法引入了类的 相同结构特征和行为特征的对象, 结构特征和行为特征的对象 概念。同人们认识客观世界的事物时采取的分类思想相同, 概念。同人们认识客观世界的事物时采取的分类思想相同, 人们在认识事物时总是将具有相同特征的事物归为一类, 人们在认识事物时总是将具有相同特征的事物归为一类,属 于某类的一个事物具有该类事物的共同特征。 于某类的一个事物具有该类事物的共同特征。
成员函数用于对数据成员处理,又叫“方法”。类的定 义中只需给出成员函数的原型,函数的定义放在类外。
类作 用域
类名::成员函数名 形参表) 成员函数名( 函数返回类型 类名 成员函数名(形参表) { 函数体; 函数体 }
由于不同的类允许有相同名称的成员函数,因此,在类外定义成员函数 的实现时,必须在成员函数名前加上所属类名和作用域操作符“:: ”。
错
类中的数据成员的类型可以是任意的,包括整型、浮点型、 2) 类中的数据成员的类型可以是任意的,包括整型、浮点型、字 符型、数组、指针和引用等,也可以是对象( 符型、数组、指针和引用等,也可以是对象(即另一个类的对 象可以作为该类的成员,但自身类的对象是不可以的) 象可以作为该类的成员,但自身类的对象是不可以的)。 一般在类中先说明公有成员(用户最关心) 后面说明私有成员。 3) 一般在类中先说明公有成员(用户最关心),后面说明私有成员。 一般将类定义的说明部分放在一个头文件中, 4) 一般将类定义的说明部分放在一个头文件中 , 而将实现部分放 在源文件中。 在源文件中。 在类的定义后必须加分号“ 。 5) 在类的定义后必须加分号“;”。
成员访问限定符(member specifier):public、 成员访问限定符(member access specifier):public、 private protected可任何次序、次数出现 修饰其后 出现, 其后的成员的访问权限 、 protected可任何次序、次数出现,修饰其后的成员的访问权限 。但一个成员只能具有一种访问属性 public: 指定其后的成员是公有的。公有成员是类与外部的 是类与外部的接口 public: 指定其后的成员是公有的。公有成员是类与外部的接口 可被程序中的任何代码访问。 ,可被程序中的任何代码访问。 private: 私有成员, private: 私有成员,只能被类本身的成员函数及友元类的成员 函数访问,其他类的成员函数, 函数访问,其他类的成员函数,包括其派生类的成员函数都不能访 即不能被继承) 若省略关键字private private, 问(即不能被继承)。若省略关键字private,则必须紧跟在类名称 后声明。类中的数据和函数若不特别声明,都被视为私有类型。 后声明。类中的数据和函数若不特别声明,都被视为私有类型。 protected:保护成员,与私有成员类似, protected:保护成员,与私有成员类似,但是除了类本身的成 员函数和友元函数可以访问外,该类的派生类的成员也可以访问。 员函数和友元函数可以访问外,该类的派生类的成员也可以访问。
例 日期类的定义
说明部分
class Cdate { public: void SetDate(int y,int m,int d); int IsLeapYear( ); void print( ); private: int year,month,day; }; void Cdate::SetDate(int y,int m,int d) { year=y; month=m; day=d; } int Cdate::IsLeapYear( ) { return (!(year%4) && !(year%100))||!(year%400)); } void Cdate::print( ) { cout<<year<<“.”<<month<<“.”<<day<<endl; }
类与对象类与对象的概念类的定义创建对象构造函数与析构函数this指针类对象作为成员对象数组对象指针作用域静态成员类与对象的概念对于同一种对象如许多学生对象它们具有相同的结构特征和行为特征只是表示内部状态的数据值不同
第5讲 类与对象
Байду номын сангаас
类与对象的概念 类的定义 创建对象 构造函数与析构函数 this指针 类对象作为成员 对象数组 对象指针 作用域 静态成员 友元 类模板
§2-2 成员函数
类的成员函数描述类的行为,又叫“方法” ,是程序算法的实 现部分,是对封装的数据进行操作的唯一途径。 在类定义中给出函数原型的声明,说明函数返回值类型、 在类定义中给出函数原型的声明,说明函数返回值类型、函数 名和函数的参数表;通常在类定义之外给出函数的具体实现, 名和函数的参数表;通常在类定义之外给出函数的具体实现, 这是一般成员函数的定义方法。 这是一般成员函数的定义方法 成员函数可以是内联函数、带缺省参数的函数、重载函数 内联函数、 内联函数 带缺省参数的函数、重载函数。 类名::成员函数名( ::成员函数名 函数返回类型 类名::成员函数名(形参表 ) { 函数体 } 域区分符(::):由于不同的类允许有相同名称的成员函数,因此,在
类是对一组具有相同特征的对象的抽象描述,所有这些对象都是 类是对一组具有相同特征的对象的抽象描述, 这个类的实例。学生是一个类,而一个具体的学生则是学生 这个类的实例。学生是一个类,
类的一个实例/对象。 类的一个实例/对象。 因此,一个类的定义至少包含以下两个方面的描述: 因此,一个类的定义至少包含以下两个方面的描述: 该类所有实例的属性或结构的定义(数据成员) 1) 该类所有实例的属性或结构的定义(数据成员): type vars 该类所有实例的操作或行为或方法的定义(成员函数) 方法的定义 2) 该类所有实例的操作或行为或方法的定义(成员函数): member functions
class <类名 类名> 类名 §2-1 类的定义 { public: : class是定义类的关键字。 是定义类的关键字。 是定义类的关键字 <公有数据成员和成员函数 ; 公有数据成员和成员函数>; 公有数据成员和成员函数 <类名 是标识符 , 用于惟一 类名>是标识符 类名 是标识符, : 标识一个类, 一般以“ 开头 开头, 标识一个类 , 一般以 “ C”开头 , protected: <保护数据成员和成员函数 ; 保护数据成员和成员函数>; 保护数据成员和成员函数 以区别其他标识符。 以区别其他标识符 。 数据类型 private: : 名 <私有数据成员和成员函数 ; 私有数据成员和成员函数>; 私有数据成员和成员函数 一对大括号内是类的说明部分, 一对大括号内是类的说明部分, }; ; 说明该类的所有成员。 说明该类的所有成员。 <各个成员函数的实现 ; 各个成员函数的实现>; 各个成员函数的实现
封装:封装是一种信息隐藏技术,对象内部对用户是隐藏的, 封装:封装是一种信息隐藏技术
不可直接访问;用户只能见到对象封装界面上的信息,通过对象 的外部接口访问对象。用户向对象发送消息,对象根据收到的消 息调用内部方法作出响应。封装的目的在于将对象的使用者和对 象的设计者分开,使用者无须知道对象内部的实现细节,只需知 道对象接收的消息即可。封装的定义为: 1) 一个清楚的边界。所有对象的内部软件的范围被限定在这个 边界内。 2) 一个接口。该接口用以描述这个对象和其它对象之间的相互 作用(类的公有成员)。 3) 受保护的内部实现。这个实现是对象提供的功能的实现细节, 不能在定义该对象的类的外面访问(类的私有成员和保护成员)。 对象的封装特性可提高模块的独立性,易于系统的调试和维护。 C++通过设置成员的访问权限的控制属性从而实现类的成员访问 控制,体现了类的隐藏和封装特性。
对于内联成员函数,编译时在所有调用该函数的地方将装入 对于内联成员函数,编译时在所有调用该函数的地方将装入 实际的函数代码。 实际的函数代码。
上例的实现部分也可放在类内:内联
class Cdate { public: void SetDate(int y,int m,int d) { year=y;month=m;day=d;} int IsLeapYear( ) { return (year%4==0 && year%100!==0)||(year%400==0);} void print( ) { cout<<year<<”.”<<month<<”.”<<day<<endl;} private: int year,month,day; };
也可用关键字 inline 强制定义为内联函数
定义类时应注意的事项
1) 在类内不允许对其数据成员进行初 始化:因为类是一个数据类型, 始化:因为类是一个数据类型,定 义后并没有存储空间, 义后并没有存储空间,因此不能对 数据成员进行初始化( 数据成员进行初始化(但静态数据 成员可在类外进行初始化)。 成员可在类外进行初始化)。
Class Tdate { public: ┇ private: int year=1998,month=4,day=9; //不允许对数据成员进行初始化 };
在C++中,类是一种数据类型,而对象是该类型的变量,变量名 C++中 类是一种数据类型,而对象是该类型的变量, 即是某个具体对象的标识。 即是某个具体对象的标识。
§ 2 类的定义 类是对一组客观对象的抽象,它将该组对象所具有 的共同特征(包括结构特征和行为特征 结构特征和行为特征)进行归纳 结构特征和行为特征 抽象,以说明该组对象的性质和能力 性质和能力。 性质和能力 类是一种用户自定义的新的数据类型,比结构更复 杂。它是将不同类型的数据和与这些相关的操作封 装在一起的集合体。 类的定义一般分为说明部分和实现部分 说明部分和实现部分。说明部分 说明部分和实现部分 用来说明该类中的成员,包括数据成员和成员函数 的说明。成员函数是用来对数据成员进行操作的, 又称为方法。实现部分是用来对成员函数的定义。 使用者关心的往往是说明部分,而实现部分则不必 关心。
类外定义成员函数的实现时,必须在成员函数名前加上所属类名和作用 域操作符“:: ”。 ::
1. 内联函数
内联函数:指在类中定义的函数, 内联函数:指在类中定义的函数,类外定义的 函数缺省情况下都是非内联函数。 函数缺省情况下都是非内联函数。
class CClock { private: int hour,minute,second; public: void SetTime(int h,int m,int s); void ShowTime() //内联函数 内联函数 内联 { cout<<hour<<“:”<<minute<< “:”<< second<<endl; } };
实现部分
例 时间类的定义
class CClock { public: void SetTime(int h,int m,int s); void ShowTime(); //成员函数 成员函数 private: int hour,minute,second; //数据成员 数据成员 }; void CClock::SetTime(int h,int m,int s) //成员函数的定义 成员函数的定义 { hour=h; minute=m; second=s; } void CClock::ShowTime() { cout<<hour<<“:”<<minute<< “:”<< second<<endl; }
§1 类与对象的概念
对于同一种对象,如许多学生对象, 对于同一种对象,如许多学生对象,它们具有相同的结构特征和 行为特征,只是表示内部状态的数据值不同。为了描述这种 行为特征, 相同结构特征和行为特征的对象,面向对象方法引入了类的 相同结构特征和行为特征的对象, 结构特征和行为特征的对象 概念。同人们认识客观世界的事物时采取的分类思想相同, 概念。同人们认识客观世界的事物时采取的分类思想相同, 人们在认识事物时总是将具有相同特征的事物归为一类, 人们在认识事物时总是将具有相同特征的事物归为一类,属 于某类的一个事物具有该类事物的共同特征。 于某类的一个事物具有该类事物的共同特征。
成员函数用于对数据成员处理,又叫“方法”。类的定 义中只需给出成员函数的原型,函数的定义放在类外。
类作 用域
类名::成员函数名 形参表) 成员函数名( 函数返回类型 类名 成员函数名(形参表) { 函数体; 函数体 }
由于不同的类允许有相同名称的成员函数,因此,在类外定义成员函数 的实现时,必须在成员函数名前加上所属类名和作用域操作符“:: ”。
错
类中的数据成员的类型可以是任意的,包括整型、浮点型、 2) 类中的数据成员的类型可以是任意的,包括整型、浮点型、字 符型、数组、指针和引用等,也可以是对象( 符型、数组、指针和引用等,也可以是对象(即另一个类的对 象可以作为该类的成员,但自身类的对象是不可以的) 象可以作为该类的成员,但自身类的对象是不可以的)。 一般在类中先说明公有成员(用户最关心) 后面说明私有成员。 3) 一般在类中先说明公有成员(用户最关心),后面说明私有成员。 一般将类定义的说明部分放在一个头文件中, 4) 一般将类定义的说明部分放在一个头文件中 , 而将实现部分放 在源文件中。 在源文件中。 在类的定义后必须加分号“ 。 5) 在类的定义后必须加分号“;”。
成员访问限定符(member specifier):public、 成员访问限定符(member access specifier):public、 private protected可任何次序、次数出现 修饰其后 出现, 其后的成员的访问权限 、 protected可任何次序、次数出现,修饰其后的成员的访问权限 。但一个成员只能具有一种访问属性 public: 指定其后的成员是公有的。公有成员是类与外部的 是类与外部的接口 public: 指定其后的成员是公有的。公有成员是类与外部的接口 可被程序中的任何代码访问。 ,可被程序中的任何代码访问。 private: 私有成员, private: 私有成员,只能被类本身的成员函数及友元类的成员 函数访问,其他类的成员函数, 函数访问,其他类的成员函数,包括其派生类的成员函数都不能访 即不能被继承) 若省略关键字private private, 问(即不能被继承)。若省略关键字private,则必须紧跟在类名称 后声明。类中的数据和函数若不特别声明,都被视为私有类型。 后声明。类中的数据和函数若不特别声明,都被视为私有类型。 protected:保护成员,与私有成员类似, protected:保护成员,与私有成员类似,但是除了类本身的成 员函数和友元函数可以访问外,该类的派生类的成员也可以访问。 员函数和友元函数可以访问外,该类的派生类的成员也可以访问。
例 日期类的定义
说明部分
class Cdate { public: void SetDate(int y,int m,int d); int IsLeapYear( ); void print( ); private: int year,month,day; }; void Cdate::SetDate(int y,int m,int d) { year=y; month=m; day=d; } int Cdate::IsLeapYear( ) { return (!(year%4) && !(year%100))||!(year%400)); } void Cdate::print( ) { cout<<year<<“.”<<month<<“.”<<day<<endl; }
类与对象类与对象的概念类的定义创建对象构造函数与析构函数this指针类对象作为成员对象数组对象指针作用域静态成员类与对象的概念对于同一种对象如许多学生对象它们具有相同的结构特征和行为特征只是表示内部状态的数据值不同
第5讲 类与对象
Байду номын сангаас
类与对象的概念 类的定义 创建对象 构造函数与析构函数 this指针 类对象作为成员 对象数组 对象指针 作用域 静态成员 友元 类模板
§2-2 成员函数
类的成员函数描述类的行为,又叫“方法” ,是程序算法的实 现部分,是对封装的数据进行操作的唯一途径。 在类定义中给出函数原型的声明,说明函数返回值类型、 在类定义中给出函数原型的声明,说明函数返回值类型、函数 名和函数的参数表;通常在类定义之外给出函数的具体实现, 名和函数的参数表;通常在类定义之外给出函数的具体实现, 这是一般成员函数的定义方法。 这是一般成员函数的定义方法 成员函数可以是内联函数、带缺省参数的函数、重载函数 内联函数、 内联函数 带缺省参数的函数、重载函数。 类名::成员函数名( ::成员函数名 函数返回类型 类名::成员函数名(形参表 ) { 函数体 } 域区分符(::):由于不同的类允许有相同名称的成员函数,因此,在
类是对一组具有相同特征的对象的抽象描述,所有这些对象都是 类是对一组具有相同特征的对象的抽象描述, 这个类的实例。学生是一个类,而一个具体的学生则是学生 这个类的实例。学生是一个类,
类的一个实例/对象。 类的一个实例/对象。 因此,一个类的定义至少包含以下两个方面的描述: 因此,一个类的定义至少包含以下两个方面的描述: 该类所有实例的属性或结构的定义(数据成员) 1) 该类所有实例的属性或结构的定义(数据成员): type vars 该类所有实例的操作或行为或方法的定义(成员函数) 方法的定义 2) 该类所有实例的操作或行为或方法的定义(成员函数): member functions
class <类名 类名> 类名 §2-1 类的定义 { public: : class是定义类的关键字。 是定义类的关键字。 是定义类的关键字 <公有数据成员和成员函数 ; 公有数据成员和成员函数>; 公有数据成员和成员函数 <类名 是标识符 , 用于惟一 类名>是标识符 类名 是标识符, : 标识一个类, 一般以“ 开头 开头, 标识一个类 , 一般以 “ C”开头 , protected: <保护数据成员和成员函数 ; 保护数据成员和成员函数>; 保护数据成员和成员函数 以区别其他标识符。 以区别其他标识符 。 数据类型 private: : 名 <私有数据成员和成员函数 ; 私有数据成员和成员函数>; 私有数据成员和成员函数 一对大括号内是类的说明部分, 一对大括号内是类的说明部分, }; ; 说明该类的所有成员。 说明该类的所有成员。 <各个成员函数的实现 ; 各个成员函数的实现>; 各个成员函数的实现
封装:封装是一种信息隐藏技术,对象内部对用户是隐藏的, 封装:封装是一种信息隐藏技术
不可直接访问;用户只能见到对象封装界面上的信息,通过对象 的外部接口访问对象。用户向对象发送消息,对象根据收到的消 息调用内部方法作出响应。封装的目的在于将对象的使用者和对 象的设计者分开,使用者无须知道对象内部的实现细节,只需知 道对象接收的消息即可。封装的定义为: 1) 一个清楚的边界。所有对象的内部软件的范围被限定在这个 边界内。 2) 一个接口。该接口用以描述这个对象和其它对象之间的相互 作用(类的公有成员)。 3) 受保护的内部实现。这个实现是对象提供的功能的实现细节, 不能在定义该对象的类的外面访问(类的私有成员和保护成员)。 对象的封装特性可提高模块的独立性,易于系统的调试和维护。 C++通过设置成员的访问权限的控制属性从而实现类的成员访问 控制,体现了类的隐藏和封装特性。