谭浩强c++面向对象程序设计 (红色书皮)大纲笔记.doc
- 文档编号:1979011
- 上传时间:2023-05-02
- 格式:DOC
- 页数:23
- 大小:91KB
谭浩强c++面向对象程序设计 (红色书皮)大纲笔记.doc
《谭浩强c++面向对象程序设计 (红色书皮)大纲笔记.doc》由会员分享,可在线阅读,更多相关《谭浩强c++面向对象程序设计 (红色书皮)大纲笔记.doc(23页珍藏版)》请在冰点文库上搜索。
第一章C++初步知识
第一节从C到c++
一:
c++的输入输出语句
C++用cin和cout完成输入输出功能,c用scanf和printf
二:
c++用const定义常变量
C语言#definePI3.14
c++constfloatpi=3.14
三:
c++函数原型声明
四:
c++函数的重载
函数名相同,参数个数或类型,或函数返回值之中有不同的,用一个函数名实现不同的功能
五:
函数模板
定义完函数模板,系统根据实际参数的类型赋给相应的形参
形式template
六:
c++有默认参数的函数
七:
变量的引用(别名)
Inta
Int&b=a;b是a的引用(别名),共同占用同一个内从
八:
内置函数
不重要
九:
运算符作用域
:
:
以后见了再说
十:
字符串变量
C语言用字符数组表示字符串,c++本身就有string数据类型
十一:
动态分配内存
C语言用malloc函数和free函数
C++用new函数和delete函数
第二章类和对象
第一节类的声明和对象的定义
一:
类和对象的关系
二:
类的声明
Class类名
{
Public:
Private:
};
三:
对象的定义
1,先声明类再定义对象
2,声明类的同时定义对象
3,不出现类名直接定义对象
第二节类的成员函数
一:
成员函数的作用
调用数据成员
二:
在类外定义成员函数
1,成员函数:
类型名类名:
:
成员函数名(参数表列)
2,构造函数类名:
:
成员函数名(参数表列)
没有类型名是因为构造函数没有参数没有返回值
三:
inline成员函数
四:
成员函数的存储方式
不和数据成员在一起,独立存储,不同对象使用相同的成员函数,通过this指针区别不同的对象
第三节对象成员的引用
一:
通过对象名加成员运算符
二:
通过引用名加成员运算符
三:
通过指针访问
第四节类的特点
一:
抽象性
类和对象的关系:
类是对象的抽象,对象是类的具体
二:
封装性
公用接口和私有实现的分离(privatepublic)
三:
继承性(第三章)
四:
多态性(第四章)
第三章关于类和对象的进一步讨论
第一节对象的初始化(用构造函数)
一:
构造函数的定义
给对象初始化的函数叫做构造函数
二:
用构造函数初始化的方法
1.默认构造函数
2.初始化构造函数(可以用参数初始化表进行初始化)
3.带默认参数的初始化构造函数
三:
调用构造函数的时间
定义对象时自动调用构造函数
第二节析构函数
一:
析构函数的作用
撤销对象之前的清理工作,或者清理前的最后操作
二:
调用析构函数的时间
对象撤销前自动调用析构函数
第三节调用构造函数和析构函数的顺序
一:
先构造后析构,后构造先析构
二:
要考虑对象撤销的顺序
第四节对象数组
一:
对象数组的定义
类名对象数组名[个数]
二:
对象数组的初始化
例如studentstu【3】={
Student(1001,1889),
Student(1002,1979),
Student(1003,1881)};
第五节对象指针
一:
指向对象的指针
定义对象时会为对象分配一定的内存空间,内存空间的起始地址就是该对象的指针
类名*指针变量名
二:
指向成员的指针
1,指向数据成员的指针
和定义普通变量指针一样类型名*指针变量名
2,指向成员函数的指针
指向普通函数的指针类型名(*指针变量名)(参数表列)
指向成员函数的指针类型名(类名:
:
*指针变量名)(参数表列)
三:
this指针
第六节公用数据的保护
一:
常对象
1,声明方法:
类名const对象名(实参表列)
//常对象中的数据成员为常变量且必须要有初值
2,特点数据成员全部为const型,成员函数为非const型
类外不能调用该对象的飞const型的成员函数
Const型成员函数可以访问const型数据成员,但不能改变他们的值
二:
常对象成员
1,常数据成员(只能通过构造函数参数初始化表对其进行初始化)
2,常成员函数(只能引用类中的数据成员,不能修改他们)
三:
指向对象的常指针
四:
指向常对象的指针
五:
对象的常引用
第七节对象的动态建立和释放
一:
new建立动态对象
指针名=New类名
返回值是个指针,分配成功时该指针指向非0数据,分配失败时该指针指向0
二:
delete释放动态对象
Delete指针名
第八节对象的赋值和赋值
一:
对象的赋值
同类对象可以通过赋值运算符“=”进行赋值
对象名2=对象名1
二:
对象的复制(用到复制构造函数
1类名对象2(对象1)
2类名对象2=对象1
第九节静态成员
一:
静态数据成员
1,定义用static声明的数据成员为静态数据成员
2,特点静态数据成员不属于某个对象,独立分配单元,所有对象的静态数据成员相同并且都可以改变其值
3,初始化只能在类体外进行初始化
数据类型类名:
:
静态数据成员名=初值
4,引用既可以通过对象名引用,也可以通过类名引用
二:
静态成员函数(没有this指针)
作用:
处理静态数据成员
第十节友元
一:
友元函数
1,普通函数声明为友元函数
2,成员函数声明为友元函数
二:
友元类
第十一节模板
一:
函数模板
Template
二:
类模板
Template
第四章运算符重载
第一节什么是运算符重载
一:
函数重载对一个已有的函数赋予新的含义(功能)即一名多意
二:
运算符重载赋予c++运算符新的意义
第二节运算符重载的方法
一:
方法函数类型operator运算符名(形参列表)
{对运算符的操作}
二:
说明
函数名为operator运算符名
第三节重载运算符的规则
一:
不能创造运算符只能重载c++已有运算符
二:
不能改变运算符个数
三:
优先级不能变
四:
结合性不能变
五:
不能有默认参数
六:
参数中至少有一个是类对象
七:
=&不用重载,可直接用
八:
运算符重载函数可以是成员函数,友元函数,或都不是第四节运算符重载函数作为成员函数和友元函数
一:
做成员函数(少一个参数)
二:
做友元函数
第五节重载双目运算符
举例
第六节重载单目运算符
举例
第七节重载流插入运算符和流提取运算符
一:
重载流插入运算符<<
二:
重载流提取运算符>>
第八节不用类型数据间的转换
一:
标准类型间的转换
1,隐式转换inta=3
a=a+4.4
2,显式转换
C标准(类型名)数据
C++标准类型名(数据)
二:
用转换构造函数进行类型转换
1,作用将一个其他类型的数据转换成一个指定类的对象
2,特点只有一个参数
可以转换标准类型也可以转换其他类成员
3,举例complex(doubler){real=r;imag=0}
三:
用类型转换函数进行类型转换
1,作用将一个类对象转换为其他类型的数据
2,形式operator类型名()
{实现转换的语句}
第五章继承与派生
第一节继承与派生的概念
一:
继承和派生的概念
1,继承:
在一个已有类的基础上建立一个新的类,新类从已有类哪里获得其已有的特性,这种现象就叫做类的继承;
2,派生:
从一个已有类产生一个新类的过程叫做派生;
二:
继承的分类
1,单继承(一个爹)
2,多重继承(好几个爹)
三:
基类和派生类的关系
基类是派生类的抽象化,派生类是基类的具体化
第二节派生类的声明方式
一:
单继承的派生类声明方式
Class派生类名:
继承方式基类名
{派生类新增成员}
二:
多重继承的派生类的声明方式
Class派生类名:
继承方式1基类名1,继承方式2基类名2
{派生类新增成员}
第三节派生类的构成
一:
派生类的构成
1,基类成员
2,派生类新增成员
二:
派生类的生成步骤
1,从基类接受全部数据成员和成员函数
2,调整从基类接受的数据成员
3,声明派生类新增加的成员
第四节派生类的访问属性
一:
公用继承(最常用)
基类成员的属性在派生类中不改变
二:
私有继承
基类私有还是基类私有
基类共有和保护变为派生类私有
三:
保护继承
基类私有还是基类私有
基类共有和保护变为派生类保护
四:
多级派生时的访问属性
一级一级往下推就可
第五节派生类的构造函数和析构函数
一:
简单派生类的构造函数
派生类构造函数名(总参数表列):
基类构造函数名(基类参数表列)
{派生类中新增数据成员初始化语句}
二;含有子对象的派生类的构造函数
派生类构造函数名(总参数表列):
基类构造函数名(参数表列),子对象名(参数表列)
{派生类中新增数据成员初始化语句}
三:
多层派生时的构造函数
派生类构造函数名(总参数表列):
直接基类构造函数名(参数表列)
{派生类中新增数据成员初始化语句}
四:
派生类构造函数的特殊形式
1,当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数体可以为空
2,如果在基类中没有定义构造函数,或定义了没有参数的构造函数,那么,在定义派生类自己的构造函数时可以不写基类的构造函数。
五:
派生类的析构函数
1,析构函数的声明方式~类名(){}
2,析构函数的顺序
先执行派生类自己的析构函数,在执行子对象的析构函数
最后执行基类的析构函数
第六节多重继承
一:
声明多重继承的方法
Class派生类名:
继承方式1基类名1,继承方式2基类名2
{派生类新增成员}
二:
多重继承派生类的构造函数
派生类名(总参数表列):
基类1构造函数(参数表列),基类2构造函数(参数表列)
{派生类新增数据成员初始化语句}
三:
多重继承引起的二义性问题
1,两个基类有同名成员
2,两个基类和派生类有同名成员
3,基类1和基类2都是从一个基类派生的
四:
虚基类
1,虚基类的作用在继承间接共同基类时只保留一份成员
2,虚基类的声明方法(在声明派生类时,不是声明基类声明)
Class派生类名:
virtual继承方式基类名
3,虚基类的初始化(在最后的派生类中不仅要负责直接基类初始化,还要负责对虚基类初始化)
第七节基类与派生类的转换
一:
派生类对象可以向基类对象赋值
二:
派生类对象可以向基类对象的引用赋值
三:
派生类对象可以代替基类对象做函数的实参;
四:
指向基类对象的指针可以指向派生类对象,但只是指向其中基类的那部分;
(总之:
派生类对象可以代替基类对象——大材小用)
第八节继承与组合
一:
定义
1,继承:
在一个已有类的基础上建立一个新的类,新类从已有类哪里获得其已有的特性,这种现象就叫做类的继承
2,组合:
在一个类中以另一个类的对象作为数据成员的,称为类的组合
二:
举例
第六章多态性与虚函数
第一节多态性的概念
一:
多态性的定义
1,c++的定义:
具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。
2,面向对象程序的定义:
向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。
二:
多态性的分类
1,静态多态性编译时确定调用哪个函数,通过函数重载实现
2,动态多态性运行时确定调用哪个函数,通过虚函数实现
第二节典型例子
#include
classpoint
{
public:
point(floata=0,floatb=0):
x(a),y(b){}
voidset_point(floata,floatb);
floatget_x();
floatget_y();
friendostream&operator<<(ostream&output,point&pt);
private:
floatx;
floaty;
};
voidpoint:
:
set_point(floata,floatb)
{x=a; y=b;}
floatpoint:
:
get_x()
{returnx;}
floatpoint:
:
get_y()
{returny;}
ostream&operator<<(ostream&output,point&pt)
{
output<<"["< returnoutput; } classcircle: publicpoint { public: circle(floata=0,floatb=0,floatr=0): point(a,b),radius(r){} voidset_radius(floatr); floatget_radius(); floatarea(); friendostream&operator<<(ostream&output,circle&pt); private: floatradius; }; voidcircle: : set_radius(floatr) {radius=r;} floatcircle: : get_radius() {returnradius;} floatcircle: : area() {return2*3.14*radius;} ostream&operator<<(ostream&output,circle&pt) { output<<"["< output<<"area="< returnoutput; } classcylinder: publiccircle { public: cylinder(floata=0,floatb=0,floatr=0,floath=0): circle(a,b,r),heigh(h){} voidset_heigh(floath); floatget_heigh(); floatarea(); floatvolume(); friendostream&operator<<(ostream&output,cylinder&pt); private: floatheigh; }; voidcylinder: : set_heigh(floath) {heigh=h;} floatcylinder: : get_heigh() {returnheigh;} floatcylinder: : area() {return2*circle: : area()+2*3.14*circle: : get_radius();} floatcylinder: : volume() {returncircle: : area()*heigh;} ostream&operator<<(ostream&output,cylinder&pt) { output<<"["< output<<"area="< returnoutput; } intmain() { cylinderc(1.1,2.2,3.3,4.4); cout<<"x="< c.set_point(5.5,6.6); c.set_radius(7.7); c.set_heigh(8.8); cout<<"x="< cout< point&pref=c; cout<<"\nprefasapoint: "< circle&cref=c; cout<<"\ncrefasacircle: "< return0; } 第三节虚函数 一: 虚函数的作用 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。 二: 虚函数的使用方法 1,在基类用virtual声明成员函数为虚函数 2,在派生类中重新定义该函数体。 此函数与基类虚函数参数个数类型,返回值类型都相同。 3,定义一个指向基类对象的指针,并使它指向同一类组中的某一对象。 4,通过该指针变量调用此虚函数。 三: 静态关联和动态关联 1,静态关联: 在编译阶段确定调用哪个函数,称为静态关联 2,动态关联: 在运行阶段确定调用哪个函数,称为动态关联 四: 虚函数的特点 1,只能声明类的成员函数为虚函数。 2,一个成员函数为虚函数后,其派生类的所有同名函数均为虚函数。 五: 什么情况下应当声明虚函数 1,做基类的成员函数可以声明虚函数 2,如果基类成员函数的作用在派生类中的作用不需要修改,则不需要声明为虚函数。 3,考虑成员函数的调用使用函数名还是用指针。 4,有时,定义虚函数时,不指定函数体(函数体为空)。 ——纯虚函数 六: 虚析构函数 一般将析构函数定义为虚函数。 第四节纯虚函数和抽象类 一: 纯虚函数 1,定义 纯虚函数是在声明虚函数时被初始化为0的函数 2,形式 Virtual函数类型函数名(参数表列)=0 3,特点 纯虚函数没有函数体 =0不代表返回值为0,只是形式而已 这是一个声明语句,最有要有分号 4,作用 在基类中为派生类保留一个函数的名字,以便派生类根据需要对它进行定义 二: 抽象类 1,定义 不用来定义对象,只作为基类来派生的类称为抽象基类(抽象类) 2,目的 作为基类去建立派生类,为派生类预留函数名,功能让派生类自己定义 3,特点 包含纯虚函数的类都是抽象类 抽象类的派生类为纯虚函数重新定义后,派生类就不在是抽象类 抽象类不能定义对象,但是可以用指向抽象基类的指针指向它 第七章输入输出流 第一节C++的输入和输出 一: 输入输出的含义 1输入: 从输入文件将数据传送给程序 2输出: 将数据从程序传送给输出文件 二: 输入输出的分类 1标准的输入输出 2文件的输入输出 3字符串输入输出 三: c++输入输出的特点 1,安全性 2,可扩展性 四: c++的输入输出流 键盘—>键盘缓冲区—>输入缓冲区—>内存—>输出缓冲区—>显示器 1,iostream类库(I/O类库)中有关的类 在该类中包含许多用于输入输出的类 2,与iostream类库(I/O类库)有关的头文件 I/O类库中的类是在不同的头文件中定义的 头文件中不仅定义了不同的类,还定义了对象和运算符重载函数。 如Iostream头文件中定义了四种对象: cincoutcerrclog 3,在iostream头文件中定义的流对象 Iostream头文件中包含的类有: ios,istream,ostream,等 Iostream头文件中就定义了四种对象: cincoutcerrclog 4,在iostream头文件中重载运算符 第二节标准输出流 一: cout,cerr,clog流 1,cout流 Cout是ostream流对象,不是c++的关键字 Cout输出数据时可以不考虑数据的类型,系统自己判断 Cout流有输出缓冲区 Cout流只对标准数据进行了<<重载 2,cer
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
下载 | 加入VIP,免费下载 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 谭浩强 c+面向对象程序设计 红色书皮 大纲笔记 c+ 面向 对象 程序设计 红色 书皮 大纲 笔记
