版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象相关概念:
类:具有相同属性和行为的对象集合,把数据和操作封装在一起
对象:数据+操作。
面向对象特征:抽象,封装,继承,多态
、输入输出:输入:输入不能有输出
2<e>”>>"endlocout<<a<<b<<endl;
3、const修饰符:
•指向常量的指针:如constchar*p-abed”;不允许改变指针所指的常量,如
p[3]=x'是错误的,但是可以改变指针p的值p=〃mn”;是对的。
•常指针:char*constp="abed”;指针本身是常量,不能移动,但是所指内容
为变量,可以更改,如p[3]='x'是对的。
•常数据成员,常成员函数,常对象:在类中声明的数据或函数可以是常量,对于常
数据成员要用初始化列表初始值,在C++类中,const关键字可以修饰对象和成员函数,
const对象不能被修改,一个常对象只能调用它的常成员函数,不能调用普通成员函数。
常成员函数格式:类型说明符函数名(参数表)const;常成员函数可以参加重载。
常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数,const成员函
数不能修改数据成员。
4、内联函数:在函数说明前冠以关犍字inline,目的是消除函数调用时的系统开销,
提高运行速度。
注意:
内联函数体内不能有循环语句和switch语句。
内联函数的声明必须出现在内联函数第一次被调用之前。
类结构中所有在类说明体内定义的函数都是内联函数。
5、带有缺省参数值的函数:在说明函数原型时,可以给一个或多个形参指定缺省值,
调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。如某一分类point
的构造函数原型为point(intx=l,inty=0);则参数x和y的缺省值为1和0.
注意:
在函数原型中,所有缺省值的参数都必须从右往左缺省,在函数调用时从左往右将实
参与形参结合,如point(intx=lrinty=0){X=x;Y=y;},那么执行pointp(3)之后p
的X和Y值分别为3,0.
6、函数重载:C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而
形成重载。
注意:
重载函数的形参必须不同:个数不同或类型不同。编译程序将根据实参和形参的类型
及个数的最佳匹配来选择调用哪一个函数。
例:
voidadd(intm,intn)
{cout<<r,twointegernumbersm+n=r,<<m+n<<endl;}
voidadd(floatx,floaty)
{coutvv“twofloatnumbersm+n="<<m+n<<endl;}
inti=l,j=2;floatf=1.0,d=2.0;
add(i,j);add(f,d);则前者调用第一个函数,后者调用第二个函数
输出twointegernumbersm+n=3
twofloatnumbersm+n=3.0
7、引用:引用(&)是标识符的别名,例如:inti;int&ri=i;〃建立一个int型的引用
ri,并将其初始化为变量i的一个别名。
中。
运算符delete用于释放new分配的存储空间,基本格式:delete指针名;
说明:
•可以用new将分配的对象初始化,new和delete都可以重载。
•new分配的空间使用结束后应该也只能用delete显式释放,否则将不能回收而变
成死空间
•使用new为数组动态分配内存:指针变量二new类型名[下标值];如int*p二new
int[10];
释放时:delete口指针变量名;如delete[]p;
•new可以为简单变量分配内存时同时进行初始化,指针变量=!1©\/7类型名(初始
化列表);
如int*p=newint(10);
10、类是一种用户自定义类型,声明形式:
class类名称
public:
公有成员(外部接口)
private:
私有成员
protected:
保护型成员
);类成员中缺省访问方式为私有
•公有类型成员:在关犍字public后面声明,它们是类与外部的接口,任何外部函
数都可以访问公有类型数据和函数。
•私有类型成员:在关键字private后面声明,只允许本类中的函数访问,而类外部
的任何函数都不能访问。如果紧跟在类名称的后面声明私有成员,则关键字private可以
省略。
•保护类型:在类的定义中,说明为protected的数据成员称为保护成员。保护数据
成员具有双重作用:对于其派生类而言,是公有的,而对于其外部的程序而言,是私有的
•类的成员:成员数据与一般的变量声明相同,但需要将它放在类的声明体中。成员
函数在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也
可以直接在类中给出函数体,形成内联成员函数。
•类的对象是该类的某一特定实体,即类类型的变量。声明形式:
•类名对象名;m:ClockmyClock;
•类中成员的访问方式:类中成员互访:直接使用成员名类外访问:使用“对象名.
成员名“或“对象指针名。成员名"方式访问public属性的成员
11、构造函数
构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一
个特定的状态。
特点:
•在对象创建时或new类名时由系统自动调用。
•如果程序中未声明,则系统自动产生出一个默认形式的构造函数,只有程序中定义
有构造函数,系统不再自动生成缺省的构造函数
缺省构造函数类名::缺省构造函数名(){}
•函数名必须与类名相同
•不能指定函数返回类型
•参数可以有,也可以无,参数可以带默认形参值,所以一个类可以有多个构造函数,
从而构造函数可以重载。如有一个类A,当执行语句Aa;时将自动调用该类的无参构造
函数或缺省的构造函数或带默认形参值的构造函数,但无参构造函数和带默认形参值的构
造函数二者同时出现容易出现调用时引起二义性
•允许是内联函数
利用构造函数创建对象有两种方法:
•用构造函数之间创建对象:类名对象名(实参表);如pointp(l,2);
•利用构造函数创建对象时,通过指针和new来实现:
类名*指针变量=new类名(实参表);
如A*p=newA(1,2);注意类A声明对象指针并不调用构造函数,而是通过new
创建临时对象调用构造函数,所以该语句只调用构造函数1次
12.拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用,作用是用已经存在
的对象初始化另一个同类的新对象。
类名(类名&对象名);〃拷贝构造函数如类A拷贝构造函数为:A(A&x);
拷贝构造函数特点:
•也是构造函数,所以其函数名与类名相同,没有返回值
•只有一个参数,并且是本类的对象引用,所以一个类只能有一个,不能重载
•每一个类都有一个拷贝构造函数,如果没有定义,系统会自动生成一个缺省的
调用拷贝构造函数3种情况:
•当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷
贝赋值。
•若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函
数。
•当函数的返回值是类对象时,系统自动调用拷贝构造函数。
深拷贝和浅拷贝:缺省的拷贝构造函数所实现的数据成员逐一赋值就是浅拷贝,当类
中有指针时,需要自定义拷贝构造函数,谓深拷贝。
13、析构函数
完成对象被删除前的一些清理工作。
•析构函数与构造函数名相同,但它前面必须加一个波浪号~
•析构函数没有返回值
•析构函数没有参数,所以一个类中只能有一个析构函数,所以析构函数不能重载
•当撤销对象时,或delete对象指针编译系统自动调用析构函数
•如果没有定义析构函数,系统自动生成一个缺省的析构函数
类名::~缺省析构函数名(){}
14.成员初始化列表
在声明类时,不能在数据成员的声明中对数据成员进行初始化,一般在构造函数中用
赋值语句进行,但对于内嵌的对象、常量、引用数据成员需要在构造函数的成员初始化列
表中进行。带有成员初始化列表的构造函数一般格式:
类名::构造函数名(参数表):(成员初始化列表){。。。。}
15.this指针隐含于每一个类的成员函数中的特殊指针。
16、对象数组:类名数组名[下标值];该数组中每个元素都是对象,都会自动调用构
造函数,当数组中每一个对象被删除时,系统都要调用一次析构函数。
访问方法:数组名[下标].成员名
17、对象指针:类名*对象指针名;定义对象指针不会调用构造函数
利用对象指针可以访问单个对象成员,如point*p,ob;p=&ob;p->show();或
(*p).show();
也可以用对象指针访问对象数组,对象可以作为函数参数,对象指针也可以
18、指向类成员的指针:通过指向成员的指针只能访问公有成员
指向类的非静态成员的指针
•指向公有数据成员的指针:类型说明符类名::*数据成员指针名;说明指针应该
指向哪个成员:指针名二&类名::数据成员名;通过对象名(或对象指针)与成员指针结合
来访问数据成员:对象名.*类成员指针名或:对象指针名・>*类成员指针名
•声明指向公有函数成员的指针:类型说明符(类名::*指针名)(参数表);初始化:
指针名二类名::函数成员名;通过对象名(或对象指针)与成员指针结合来访问函数成员:
(对象名.*类成员指针名)(参数表)或:(对象指针名。*类成员指针名)(参数表)
指向类的静态成员的指针
•对类的静态成员的访问不依赖于对象,可以用普通的指针来指向和访问静态成员
19、静态成员
・静态数据成员
・用关健字static声明,该类的所有对象维护该成员的同一个拷贝,必须在类外定义
和初始化,用(::)来指明所属的类。初始化格式:数据类型类名::静态数据成员名=值;
静态数据属于整个类,因此既可以通过某个对象,或对象指针去访问,也可以使用类名::
静态数据成员名格式去访问它。
•静态成员函数
■一般来说,静态成员函数只能引用属于该类的静态数据成员或静态成员函数。
■静态成员函数没有this指针
■类外代码可以使用类名和作用域操作符来调用静态成员函数。如类名::静态成员函
数名(实参表)或者对象。静态成员函数名(实参表)或对象指针・》静态成员函数名(实
参表)
如某类A:
classA
private:
staticinttotalW;
intw;
public:
A(intm)
(
w=m;
totalW+=m;
)
~A(){totalW-=w;}
staticintgetT(){returntotalW;}
);
intA::totalW=0;
voidmain()
Aal(50);
cout<<A::getT()<<endl;
Aa2(100);
cout<<a2.getT()<<endl;
}
20、友元
友元是C++提供的一种破坏数据封装和数据隐藏的机制。提高程序运行效率
•友元函数
不是当前类的成员函数,而是对立于当前类的外部函数,它可以访问该类的所有成员,
包括公有,私有,受保护。友元函数不是类的成员,所以没有this指针,它不能直接引用
对象成员的名字,它必须通过入口参数传递进来的对象名或对象指针来引用该对象的成员。
如某类girl的友元函数disp格式:voiddisp(girl&g);
•友元成员
一个类的成员函数作为另一个类的友元,它既可以访问本类的所有成员,还可以访问
friend声明所在类的所有成员
•友元类
若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。
•友元关系是单向的,不具有交换性和传递性
21、派生类
•继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或
不能完全解决)时,需要对原有程序进行改造。
•派生类的声明
class派生类名:继承方式基类名
{
成员声明;
);
继承方式:三种继承方式(省略默认为私有继承),公有继承,私有继承,保护继承
不同继承方式的影响主要体现在:
内部访问:派生类成员对基类成员的访问权限
对象访问:通过派生类对象对基类成员的访问权限
在派生类中能够直接访问的是基类的公有成员和保护成员
•公有继承(public)
基类的public和protected成员的访问属性在派生类中保持不变但基类的private
成员不可直接访问。
派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接
访问基类的private成员。
通过派生类的对象只能访问基类的public成员。
•私有继承(private)
基类的public和protected成员都以private身份出现在派生类中,但基类的
private成员不可直接访问。
派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接
访问基类的private成员。
通过派生类的对象不能直接访问基类中的任何成员。
•保护继承(protected)
基类的public和protected成员都以protected身份出现在派生类中,但基类的
private成员不可直接i方问。
派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接
访问基类的private成员。
通过派生类的对象不能直接访问基类中的任何成员
22、类型兼容规则
•一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:
-派生类的对象可以4隹遍i值给基类对象。
-派生类的对象可以初始化基类的引用。
T旨向基类的指针也可以指向派生类。
•通过基类对象名、指针只能使用从基类继承的成员
23、多继承时派生类的声明
class派生类名:继承方式1基类名1,继承方式2基类名2,
成员声明;
注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。
24、继承时的构造函数
•基类的构造函数不被继承,派生类中需要声明自己的构造函数。
•声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初
始化,自动调用基类构造函数完成。
•派生类的构造函数需要给基类的构造函数传递参数,要看具体情况
在类继承过程中,当基类只有带默认值的有参构造函数时,派生类的构造函数可能为:
默认构造函数,不带参数构造函数,带参数构造函数;当基类只有不带默认值的有参构造
函数时,派生类必须有构造函数
•单一继承时的构造函数
派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表)
(
本类成员初始化赋值语句;
);
•多继承且有内嵌对象时的构造函数
派生类名::派生类名(基类1形参,基类2形参,…基类n形参,本类形参):基类名1(参
数),基类名2(参数),…基类名n(参数),内嵌对象数据成员的初始化
(
本类成员初始化赋值语句;
);
构造函数的调用次序
1.调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右1
2,调用内嵌成员对象的构造函数,调用顺序按照它们在类中声明的顺序。
3.派生类的构造函数体中的内容。
25、继承时的析构函数
•析构函数也不被继承,派生类自行声明
•声明方法与一般(无继承关系时)类的析构函数相同。
•不需要显式地调用基类的析构函数,系统会自动隐式调用。
•析构函数的调用次序与构造函数相反。
26、虚基类
•用于有共同基类的场合
•以virtual修饰说明基类
•例:classBl:virtualpublicB
27、多态
•多态的分类:参数多态,包含多态,重载多态和强制多态
•多态的实现:函数模板和类模板,虚函数,函数重载、运算符重载
•虚函数
。虚函数是动态绑定的基础,实现多态的重要手段。
<定义在基类中进行,在类的声明中,在函数原型之前写virtual。
<virtual只用来说明类声明中的原型,不能用在函数实现时。
<具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为
虚函数。
<在派生类中重新定义时,其函数原型都必须和基类中的原型完全相同。
e调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪
个函数。
今不能是友元函数,不能是静态成员函数;不能是内联函数;不能是构造函数;可以
是析构函数。
<要求会分析具有虚函数的程序运行结果
•纯虚函数
e是在基类中说明的虚函数,它在该基类中没有定义,但要求在它的派生类中必须定
义自己的版本,或重新说明为纯虚函数:
<virtual函数类型函数名(参数表)=0;
e声明为纯虚函数后在基类中就不再给出函数实现部分,函数体有派生类给出。
今带有纯虚函数的类称为抽象类:
令不能声明抽象类的对象,可以声明指向抽象类的指针或引用。
令如果派生类中没有实现纯虚函数,只是继承基类的纯虚函数,该派生类还是一个抽
象类
•运算符重载
规则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家政讲师培训课件内容
- 客户关系管理培训
- 培训讲师课件的评估
- 新入员工安全培训考题课件
- 培训概况教学课件
- 图书介绍课件大全
- 园林白蚁防治培训课件
- 秋人教版八年级物理上册课件:第二章第3节 声音的利用 课
- 某省新型城镇化建设工程施工组织设计
- 分馏塔培训课件
- 2024年河北省公务员考试《行测》真题及答案解析
- DB41T 2495-2023 预应力钢筒混凝土管道施工质量验收评定规范
- 上海市华东师范大学附属天山学校2024-2025学年高一上学期期中评估英语试卷(无答案)
- 松下-GF2-相机说明书
- 考察提拔干部近三年个人工作总结材料
- 幼儿园大班语言《蜂蜜失窃谜案》原版有声课件
- 电镀在光电器件中的关键作用
- 施工方案与安全保障措施
- 消化系统疾病课件
- 地铁车辆检修安全培训
- GB/Z 20833.5-2023旋转电机绕组绝缘第5部分:重复冲击电压下局部放电起始电压的离线测量
评论
0/150
提交评论