C++ 第3章类和构造函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

13
权限修饰符
类成员有三种不同的访问权限: 1. 公有(public)成员可以被程序中任何代码访问。 2. 私有(private)成员只能被该类的成员函数及友元类的成员函数访问, 其它类及其子类的成员函数都不能访问。 3. 保护(protected)成员只能被该类的成员函数和说明为友元类的成员 函数访问,或子类的成员函数访问。 4.默认为private的
23
构造函数重载
class Image { public: Image(){} Image(const int w, const int h); private: int width; int height; };
//重载的构造函数
Image::Image (const int w, const int h) { this->width = w; this->height = h; } 用成员初始化表初始化类成员与用构造函数初始化类成员的区别在于:前者的 初始化是在构造函数被执行以前进行的。
1、类定义的一般形式如下: class Name { public:
类的公有函数
private: 私有的成员函数
私有的数据成员定义
}; <各个成员函数的实现> 注意:类的定义也是一个语句,所以要有分号结尾,否则,会产生难以理解的编 译错误。 2、类中的成员: 1. 数据成员,类的数据。 2. 成员函数,类的操作。
15
成员函数的定义
类成员函数的定义 成员函数可以在类内定义,也可以在类外定义 在类外定义格式: 返回类型 类名::函数名(形参表) { 函数体 } 双冒号::是域运算符,它主要用于类的成员函数的定义。 注意:如果函数体定义在类内,所有函数原型后不需要分号,且所有的函数参 数必须有名的。
16
类的实现
注意: 1.如果未指定类成员的访问权限,默认访问权限是私有的 2.数据成员和成员函数出现的顺序也没有关联
14
数据成员的初始化
类中数据成员的初始化有以下方法; 1、类定义时,只有静态数据成员可在类外直接初始化,所有的数据成员都不能 在类内初始化 静态数据成员初始化格式: 类型 类名::数据成员名 = 值 int student::sno = 10; 2、调用成员函数初始化,一般为setXXX()函数 3、创建对象时调用构造函数初始化 4、使用初始化列表初始化
也可创建对象指针同时初始化 student *stu = new student;
19
对象的使用
一、调用成员函数语法与结构变量访问其数据成员的语法相同: 对象名.数据成员名 例:cout<<stu.name<<endl; 对象名. 成员函数名 (实参表) 例:stu.setName(“lisi”); 二、成员函数也可以通过指向对象的指针,调用形式为: 指向对象的指针->数据成员名 例:stu2->name; 指向对象的指针->成员函数名 (实参表) 例:stu2->setName(“l”) 注意: (1) 对私有数据成员的访问只能通过成员函数,下面的语句是非法的: thePoint.xVal = 5; // 非法 (2) 不要混淆了类与对象的概念。类是用户定义的数据类型(不占内 存),对象是类的实例(占内存单元),
成员初始化表
三、类对象成员:类数据成员也可以是另一个类的对象。 class Rectangle { public: Rectangle (int left, int top, int right, int bottom); private: Point topLeft; Point botRight; }; Rectangle::Rectangle (int left, int top, int right, int bottom): topLeft(left,top), botRight(right,bottom) { }
18
对象的创建
对象的创建格式: 1、创建一般对象 类名 对象名; 例:student stu; //实际调用默认的构造函数创建对象 2、创建指针对象 类名 *指针名; 例:student *stu; 但是对象指针要初始化后才能使用 指针名 = new 类名 stu = new student; //实际调用默认的构造函数创建对象
12
类的定义
在函数声明时,参数名可给出也可不给出。而在定义时,它们是必需的。 例:类的定义 class Point { int xVal, yVal; public: int GetX(); int GetY(); void SetPt (int, int); void OffsetPt (int, int); };
20
this指针
C++中,定义了一个this指针,用它指向调用非静态成员函数的对象 void Date::setMonth( int month) { this->month = month; } this指针通常是每个成员函数(非静态)隐含的第一个参数。编译器在 每个成员函数的声明中插入这个隐含参数。当成员函数使用类的成员的绝对名 称的任何时候,它隐式使用this指针。编译器在引用成员函数内部的每个表达 式中插入this指针
void Point::SetPt (int x, int y) { xVal = x; yVal = y; } void Point::OffsetPt (int x, int y) { xVal += x; yVal += y; } int Point:: GetX () { return xVal; } int Point:: GetY () { return yVal; } 17
22
构造函数
问题:如果每次创建对象时都只调用成员函数对数据成员初始化,那太麻烦了, 有没有更便捷的方法对数据成员初始化呢? 构造函数:函数的名字与类名相同,它也没有返回类型和返回值。它的作用是初 始化一个对象 class Test { public: int x; Test() { } //无参的构造函数 Test(int x) //有一个参数的构造函数 { this->x = x; } }; 构造函数不能显式调用。 当对象被创建时,构造函数自动被调用。
四、类内初始化顺序 初始化的顺序如下:首先topLeft的构造函数被调用,接着调用botRight的构造函数,最后 调用Rectangle的构造函数。 TopLeft初始化在botRight之前的原因不是因为:在成员初始化表中,TopLeft位于botRight之 前,而是因为在Rectangle类的定义中,TopLeft位于botRight之前。
26
成员初始化表
常量数据成员不能用于定义数组成员的尺寸 例如: class Set { public: Set (void) : maxCard(10) { card = 0; } //... private: const maxCard; int elems[maxCard]; //非法! int card; }; 这是因为编译时,常量maxCard还没有确定的值,构造函数要到程序运行以 后才会被调用
25
成员初始化表
class Image { public: Image(const int w, const int h); private: const int width; const int height; //... }; Image::Image (const int w, const int h) : width(w), height(h) { }
24
成员初始化表
一、常量成员 类成员也可以定义为常量,例如: class Image { const int width; const int height; //... }; 常量数据成员不能用如下的方法被初始化, 也不能通过构造函数初始化: class Image { const int width = 256; // 非法! const int height = 168; // 非法! //... }; 初始化常量数据成员的正确方法是用成员初始化表:
29
析构函数
当对象销毁时,自动调用析构函数进行一些清理工作。 析构函数也与类同名,但在名字前有一个~符号,析构函数也没有返回 类型和返回值。但析构函数不带参数,不能重载,所以析构函数只有一个。 若一个对象中有指针数据成员,该指针数据成员指向某一个内存块。在 对象销毁前,往往通过析构函数释放该指针指向的内存块 class Set { public: Set (const int size); ~Set(void) {delete elems;} // 析构函数 private: int *elems; // 集合元素 int maxCard; // 集合最大尺寸 int card; // 集合元素个数 };
21
再讲访问权限
类成员有三种不同的访问权限: 1. 公有(public)成员可以被程序中任何代码访问。 2. 私有(private)成员只能被该类的成员函数及友元类的成员函数访问, 其它类及其子类的成员函数都不能访问。 3. 保护(protected)成员只能被该类的成员函数和说明为友元类的成员 函数访问,或子类的成员函数访问。 注意: 1.如果未指定类成员的访问权限,默认访问权限是私有的 2.数据成员和成员函数出现的顺序也没有关联
第2章内容回顾
引用 函数的高级用法
内联函数 重载函数 递归函数 默认参数函数
1
第 3章
类和构造函数
2
预习检查
定义类的关键字是? 构造函数的目的是?
3
3
本章目标
类与结构 成员函数 封装 构造函数 析构函数 构造对象的过程
4
本章结构
从结构到类 软件方法的发展必然 类 定义成员函数 调用成员函数 保护成员 封装 类和构造函数
27
成员初始化表
二、引用成员 类数据成员也可以被定义为引用,例如: class Image { int width; int height; int &widthRef; //... }; 引用数据成员也不能用下面的方法初始化,也不能使用构造函数初始化: class Image { int width; int height; int &widthRef = width; // 非法! //... }; 初始化引用数据成员的正确方法是使用初始化表: 28
类和对象
构造函数 析构函数 默认构造函数和带参构造函数 构造函数 重载构造函数 构造对象过程
5
3-1 类
什么是类 学习本章后,要求掌握:
声明和定义类和成员函数的方法 访问成员函数的方法 理解保护数据如何屏蔽外部访问的原理,使得对类的 封装有更好的认识
6
3-1-2 软件方法发展的必然
定义类时应注意的事项
1、在类体中不允许对所定义的数据成员进行初始化(且只静态数据成员可以在 类定义外初始化) class Point { static int xVal; int yVal=10;//错误 }; int Point::xVal=10;//正确 2、类中的数据成员的类型可以是任意的,可以是另一个类的对象可以作该类的 成员,但是自身类的对象是不可以的,而自身类的指针或引用又是可以的。 3、在类体内先说明公有成员,后说明私有成员,在说明数据成员时,一般按数 据成员的类型大小,由小至大说明,这样可提高空间利用率。 4、经常习惯地将类定义的说明部分放到一个头文件中
对象:(算法+数据结构) 程序=(对象+对象+……)
程序就是许多对象在计算机中相继表现自己 对象又是一个个程序实体
9
3-1-2 软件方法发展的必然
构成程序的对象
10
面向对象编程的三大特点
面向对象编程的三大特点:封装,继承,多态 封装:在实现程序时,将现实生活中事物的属性(类中的数据成员)和行为(类中的 成员函数)封装于类中,使类成为一个既有属性又有行为的独立个体。
继承:在实现程序时,可以像生活中儿子继承父母遗产一样,子类将父类中的属 性(类中的数据成员)和行为(类中的成员函数) 继承,从而实现父类所有内容为 子类所用的功能(代码重用) 多态:在实现程序时,可以将父类的行为(类中的成员函数)再次定义从而实现新 的行为(重载,重写),使程序的执行结果多样化
11
类的定义格式
结构化程序设计方法
程序=(算法)+(数据结构)
主函数
函数1 函数2 函数3
函数1-1
函数1-2
函数1-3
函数2-1
函数3-1
函数3-2
数据1
数据2
数据3
7
3-1-2 软件方法发展的必然
面向对象方法的基础
程序=(算法+数据结构)
8百度文库
3-1-2 软件方法发展的必然
在面向对象中,算法与数据结构被捆绑成一个类
相关文档
最新文档