第6章 类的封装性

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
};
int main() { student s; s.set(); s.print() return 0; }
类的成员函数与一般函数的区别
1. 成员函数是属于一个类的成员,出现 在类体中; 2. 成员函数一般应指定为public;
3. 成员函数可以访问类中任何成员,可 以引用在其作用域中有效的数据,函数 名则是类的对外接口;
int main() { student s; s.num=1001; s.name=“张新”; s.sex=“男”; s.age=19; s.score=90.5; s.address=“上海”;
cout<<“学号: "<<s.num<<endl; cout<<“姓名: "<<s.name<<endl; cout<<“性别: "<<s.sex<<endl; cout<<“年龄: "<<s.age<<endl; cout<<“成绩: "<<s.score<<endl; cout<<“地址:"<<s.address<<endl; return 0; }
成 员 表 列
注意:
这里仅仅定义了一个结构 体类型,系统并不为其分配 存储空间。结构体成员的类 型可以是基本类型、数组, 也可以是已定义了的结构体 类型等。
结构体变量
定义格式: struct student s1,s2;
结构体类型名 s1: s2:
占内存单元
结构体变量名 男 19 90.5 上海
int Box::volume() { return(height*width*length); } int main() { Box box1; cout<<“长方柱box1的体积是:”<<box1.volume()<<endl; Box box2(15); // 15→h cout<<“长方柱box2的体积是:”<<box2.volume()<<endl; // 15→h,30→w Box box3(15,30); cout<<“长方柱box3的体积是:”<<box3.volume()<<endl; Box box4(15,30,20); // 15→h,30→w,20→l cout<<“长方柱box4的体积是:”<<box4.volume()<<endl; }
上例是一个非常简单的实现面积计算功能的小程 序,程序将正方形的边长length及求面积操作封装 在一个正方形类中,将圆的直径length及求圆面积 操作封装在一个圆类中。在定义正方形边长和圆的 直径时,选用了同名的数据成员变量名“length”, 如果程序没有封装,很容易造成错误。特别是参数 传递时,系统不能识别程序员实际需要哪个length; 封装之后,外界不能直接访问对象的私有成员的 内容,只有通过调用公有函数来间接访问。由此可 见,对象成员被封装得很好。由于封装,数据和代 码的可重用性、可维护性和安全性都很好。可见封 装对开发大程序非常有用,它可以极大地保证程序 的质量。
#include<iostream> #include<string> using namespace std; struct student { int num; string name; string sex; short age; double score; string address; };
1001 张新
1002 王莉 4 10
女 6
20 2
95.5 北京 8 20 50 B
struct student { int num; char name[10]; char sex[6]; short age; double score; } s1,s2; // 定义了两个结构体变量
结构体变量的初始化
类与结构体 有何区别?
类默认为私有,
结构体默认为公有。
类的特征

封装性
继承性 多态性
Hale Waihona Puke Baidu
封装性
数据 数据处理
将数据(变量) 和数据处理(函数) 都封装在类体内。
类的声明
类头
class 类名 {
数据成员; 成员函数;
类体
};
类体结束符
#include<iostream> #include<string> using namespace std; class student { int num; string name; string sex; short age; double score; string address; public:
第6章
类的封装性
从结构体到类
任务 6-1
某学生的基本信息有:学号 (num=1001)、姓名(name=“张 新”)、性别(sex=“男”)、年龄 (age=19)、成绩(score=90.5)、 地址(address=“上海”)。编程 输出该学生的信息数据。
关于某个学生的信息
学号(num) 1001 整型 字符型数组 字符型数组 姓名(name) 张新 性别(sex) 男
一般成员函数的表示方式
成员函数是类的实现,按规范写法,应将成 员函数在类体内声明,在类体外定义。此时, 必须在函数名前,加上“类域标记”:
类名:: 用来说明函数是属于哪个类的。 这种表示方式,不仅可以减小类体的长度, 使类体清晰,便于阅读。而且有助于把类的接 口和类的实现细节相分离,隐藏了实现其功能 的执行细节,以提高软件工程的质量。
构造函数可以是无参数的,在建立对 象时自动执行,完成初始化工作;更多 的情况下是有参数的,带参数的构造函 数的首部的一般格式为:
类名(类型1 形参1,类型2 形参2,……)
此时定义对象的一般格式为:
类名 对象名(实参1,实参2,……)
完成任务6-3: 有两个长方柱,其长、宽、高分别为: (1) 12,25,30; (2) 15,30,21; 分别求它们的体积。 #include<iostream> class Box { public: Box(int,int,int); int volume(); private: int height; int width; int length; };
任 务 6-2
声明一个正方形类 和一个圆类,分别求 它们的面积。
完成任务6-2: 声明一个正方形类型和一个圆类型,分别求 它们的面积。
#include<iostream> class Square { int length; public: void set(int l); int area(); }; class Circle { int length; public: void set(int l); double area(); }; void Square::set(int l) { length=l; }
void Circle:: set(int l) { length=l; } int Square::area() { return length*length; } double Circle::area() { return 3.1416*length*length/4; } void main() { Square s; s.set(15); cout<< “正方形面积为:”<<s.area()<<endl; Circle c; c.set(10); cout<< “圆面积为:”<<c.area()<<endl; }
void set() { num=1001; name=“张新”; sex=“男”; age=19; score=90.5; address=“上海”; } void print() { cout<<“学号: "<<num<<endl; cout<<“姓名: "<<name<<endl; cout<<“性别: "<<sex<<endl; cout<<“年龄: "<<age<<endl; cout<<“成绩: "<<score<<endl; cout<<“地址:"<<address<<endl; }
C++新标准增加了字符串类型,这样就不必用字 符串函数而直接可以用字符串常量对字符串型成员 变量赋值,给编程带来了很大的方便。 C++新标准规定要:
1. 头文件包含不带扩展名.h;
2. 要使用命名空间标准;
3. 主函数要使用int型,若无值返回要用语句: “return 0;”作结束;
4. 使用字符串类型时,要增加使用头文件包含: #include<string>;
例6-1 使用默认参数并采用参数初始化列表方式 用构造函数对成员变量赋初值示例。
#include<iostream> class Box { public: Box(int h=10,int w=10,int l=10); int volume(); private: int height; int width; int length; }; Box::Box(int h,int w,int l):height(h),width(w),length(l) {}
C++提供了一种特殊的成员函数 — 构造函数,专门用来完成对象成员变 量的初始化工作。 特殊点: ·函数名与类名相同; ·无返回值类型; ·不需用户调用,而是在建立对象时 自动执行; ·功能单一,仅仅是完成对成员变量 的初始化工作。
构造函数的定义
类名(参数名)
例如:在Date类中要完成对三个成员 变量的初始化,构造函数在类体内函 数首部写为: Date(int y,int m,int d) 在类体外函数首部写为: Date::Date(int y,int m,int d)
// 带参构造函数声明
Box::Box(int h,int w, int l) // 带参构造函数定义 { height=h; width=w; length=l; } int Box::volume() { return(height*width*length); } int main() { // 带实参的对象定义 Box box1(12,25,30); cout<<“长方柱box1的体积是:”<<box1.volume()<<endl; Box box2(15,30,21); cout<<“长方柱box2的体积是:”<<box2.volume()<<endl; }
struct student s1={1001, “张新”,“男”,19,90.5}; struct student s2={1002, “王莉”,“女”,20,95.5};
数据类型要与其对应的结构体成员的类 型一致。
对结构体成员的引用形式
只能对结构体成员进行引用, 不能对整个结构体进行引用。对 结构体成员引用的一般格式如下:
年龄(age)
成绩(score)
19
90.5
短整型
双精度实型
地址(address)上海
字符型数组
需要存储一组性质相关类型不 同的数据,可应用结构体类型。
struct 结构体名 { 成员类型1 成员名1; 成员类型2 成员名2; …… 成员类型n 成员名n; };
struct student { int num; char name[10]; char sex[6]; short age; double score; char addess[20]; }; 分号不可忽略!
结构体变量名.成员名
(注意:“.”是成员引用运算符,优先级为1级)
如上例,对s1变量成员进行赋值操作:
s1.num=1001; strcpy(s1.name, “张新”); strcpy(s1.sex, “男”); s1.age=19; s1.score=90.5; 注意:只能对字符数组初始化,不能对其 赋值,若未能对其进行初始化而又要给值 时,就只能用字符串拷贝(复制)函数。
任 务 6-3
有两个长方柱,其长、 宽、高分别为:
(1) 12,25,30; (2) 15,30,21;
使用构造函数完成对成员 变量的赋值,分别求它们的 体积。
在定义了一个对象之后,常常需要作 某些诸如对成员变量赋初值之类的初始 化工作。能否在声明类时对成员变量进 行初始化呢? 不能!由于类是抽象的,不是一个实 体,不占据空间,无法容纳数据。只有 在定义对象时,通过对象调用公有成员 函数给对象的成员变量赋初值。但如果 对象多,成员变量也多,这种方法显得 十分不便。
相关文档
最新文档