c++要点第二部分Word文档格式.docx
- 文档编号:22586710
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:28
- 大小:36.14KB
c++要点第二部分Word文档格式.docx
《c++要点第二部分Word文档格式.docx》由会员分享,可在线阅读,更多相关《c++要点第二部分Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
一旦用户定义,系统则不提供默认构造函数。
4.析构函数是在对象消失的瞬间自动调用的函数。
形式:
~构造函数名();
为类的一个特殊的公有函数成员,没有参数,不能重载,可以是虚函数,一个类只有一个析构函数,无返回值,一般由用户自己定义,在对象消失时由系统自动调用,如果用户没有定义,则系统将自动生成一个不做任何事情的默认析构函数。
三、拷贝构造函数
建立新对象时将已存在的对象数据成员拷贝给新对象,以初始化新对象。
拷贝函数是与类名相同,形参是本类的对象的引用的函数,在用已存在的对象初始化新建立对象时调用。
一般由用户定义,如果用户没有定义,则系统自动生成一个完全拷贝的的拷贝构造函数。
定义形式:
类名(类名&
对象名)
{……
};
建立对象时,构造函数和拷贝构造函数只有一个被调用。
在三种情况下拷贝构造函数被调用:
a.用已有对象初始化新对象;
b.如果函数的形参是类的对象,调用函数时,进行形参和实参结合时;
c.如果函数的返回值是类的对象,函数执行完成返回调用者时。
注意:
深拷贝构造函数:
当类的数据成员有指针类型时,我们就必须定义一个特定的拷贝构造函数,该拷贝构造函数不仅可以实现原对象和新对象之间数据成员的拷贝,而且可以为新的对象分配单独的内存资源;
浅拷贝构造函数:
并不分配新的内存空间,直接将原对象的数据成员值依次复制给新对象中对应的数据成员。
四、对象的使用
1)对象指针
类名*对象指针
并没有建立对象,不调用构造函数。
可以用对象指针访问公有的数据成员和函数成员
对象指针名->
数据成员名
成员函数名(参数表)
指针作为形参:
实现地址传递,减少时空开销,提高效率。
2)对象引用类名&
对象引用名=被引用对象
引用对象就是被引用对象的别名,指向同一内存空间。
使用:
对象引用名.数据成员名
对象引用名.成员函数名(参数表)
两者要同类型除非是作为函数参数与函数返回值,对象引用在定义时必须进行初始化
定义一个引用并没有定义一个对象,所以不分配任何内存空间,不调用构造函数。
3)对象数组
类名对象数组名[常量表达式n]……[常量表达式2][常量表达式1];
对象数组的初始化需要使用构造函数完成。
数组名[n]={
构造函数(数据成员1初值,数据成员2初值,……),
……
构造函数(数据成员1初值,数据成员2初值,……);
}
对象数组名[下表表达式1][下表表达式2]……[下表表达式m].数据成员名
4)动态对象
随时动态建立并随时消失的对象。
对象指针=new类名(初值表);
删除:
delete对象指针;
动态数组对象对象指针=new类名[数组大小];
delete[]对象指针;
5)this指针
this指针不是调用对象的名称,而是调用对象的指针的名称
this值不能改变,它总是指向当前调用对象。
this指针是一个系统预定义的特殊指针,指向当前对象,表示当前对象的地址。
五、组合对象
一个含有其他类对象的类称为组合类,组合类的对象称为组合对象。
定义:
先定义成员类,再定义组合类。
组合对象的初始化:
初始化机制:
在定义组合类的构造函数时,可以携带初始化表,格式为:
组合类的构造函数:
组合类名(形参表):
成员对象1(子形参表1),成员对象2(子形参表2),……
{}
子形参表n为成员对象n提供初始值。
建立组合对象:
类名对象名(实参表);
注:
1.建立对象时,调用组合类的构造函数;
在调用组合类的构造函数时,先调用各个成员对象的构造函数,成员对象的初值从初始化列表中取得。
实际上就是通过成员类的构造函数对成员对象初始化,初始化值在初始化列表中提供。
2.初始化列表既不能决定是否调用成员对象的构造函数,也不能决定调用构造函数的顺序,成员对象调用顺序由成员对象定义的顺序决定。
初始化列表只是提供调用成员对象构造函数的参数。
组合对象构造函数调用的先后顺序:
成员对象按照在其组合类的声明中出现的次序,依次调用各自的构造函数,与初始化顺序无关。
若没有指定初始值,则自动调用默认的构造函数
组合类对象析构函数的调用顺序与构造函数正好相反。
组合类成员对象的访问权限
组合类成员对象的成员有存取控制权限,成员对象作为组合类的成员后,又有存取控制权限。
成员对象中的成员在组合类中的存取权限经过了两次限制,其最终权限列表如下
成员对象
组合类
private
public
不可访问
六、静态成员
解决同一个类的不同对象间数据成员和函数的共享问题。
包括:
静态数据成员和静态函数成员
1)静态数据成员
用来实现类属性描述所有对象的共同特征的一个数据项
每个类只有一个拷贝,由所有的对象共同维护使用,实现数据共享
必不可少的两部分:
类内声明,类外初始化。
类内声明:
static数据类型静态数据成员名;
类外初始化:
数据类型类名:
静态数据成员名=初始值;
注:
它在程序开始时产生,结束时消失(静态)
必须在文件作用域的某个地方对静态的数据成员进行定义并初始化,即应在类体外对静态数据成员进行初始化。
初始化时不加static。
必须在初始化时使用类作用域运算符:
限定它所属的类。
除了在初始化时可以在类外通过类对静态成员赋初值外,其他情况下对静态成员的存取规则与一般成员相同。
2)静态成员函数
c++提供了静态成员函数来存取类的静态数据成员。
static声明。
为该类的所有对象共享的成员函数可以在类内定义,也可以在类外定义。
类外定义时不再使用关键字static。
静态函数成员的调用形式:
a.通过类名调用静态成员函数
类名:
静态成员函数
b.通过对象调用静态成员函数
对象.静态成员函数
静态成员函数的访问权限同普通成员函数一样。
静态成员函数可以访问类中说明的静态数据成员,但不能直接访问类中的非静态数据成员;
若要访问,必须通过参数传递得到相应的对象,再通过对象来访问。
由于静态成员是独立于类对象而存在的,所以静态成员函数没有this指针。
七、友元
只要将外界的某个对象说明为类的一个友元,那么这个外界的对象就可以访问这个类对象中的所有成员。
友元不是类的成员,但它可以访问类的任何成员。
声明为友元的外界对象既可以是另一个类的成员函数,也可以是不属于任何类的一般函数,称为友元函数;
友元也可以是整个的一个类,称为友元类。
1.友元函数
在类定义中由关键字friend修饰的非成员函数。
friend返回类型函数表(形参表)
函数体
它不是本类的成员函数,不能通过对象调用。
可在类中或类外定义,在类外定义时,不可指出函数所属的类。
它可存取类的任何存取控制属性的成员,可通过对象存取形参、函数体中该类类型对象的所有成员。
一般放在类体的后面。
2.友元类
A类声明为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的任何数据成员。
classB{
friendclassA;
在声明A类为B类的友元类时,A类必须存在,但是如果A类又将B类声明为自己的友元类时,又会出现B类不存在的错误。
使用前向引用声明,即引用未定义的类之前对该类进行声明,只是为程序引入一个代表给类的标识符,类的具体定义可以在程序的其他地方进行。
友元关系不可传递。
友元关系是单向的。
正确权衡共享和封装之间进行恰当的折衷。
(二)继承与派生
表达了类与类之间所具有的共同性和差异性,简化了人们对事物的认识和描述。
派生类自动地、隐含地拥有基类的数据成员和函数成员,体现了代码重用和软件重用的思想。
一、派生类
1.定义
class派生类名:
继承方式1基类名1,继承方式2基类名2,……
private:
派生类的私有数据和函数
public:
派生类的公有数据和函数
protected:
派生类的保护数据和函数
};
继承方式:
public
private
protected
系统默认的是私有继承
2.派生类的实现方式
1)吸收基类成员
基类的全部成员被派生类继承(除构造函数和析构函数)
2)改造基类成员
限制:
通过继承方式实现
改造:
通过同名覆盖实现,定义一个同名的新成员
3)添加新成员
在继承派生类的基础上,根据派生类的需要,增加一些新的数据成员和函数成员,以描述新的属性和行为。
3.继承的性质
1)可以传递
(直接基类和间接基类)
2)继承关系不允许循环
4、继承与组合
继承描述一般与特设(AisaB)
组合描述整体与部分(AhasaB)
二、继承的方式
C++中的继承方式有:
public、private、protected三种(它们直接影响到派生类的成员、及其对象对基类成员访问的规则)。
(1)public(公有继承):
继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。
派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;
派生类的对象只能访问基类中的public成员。
(2)private(私有继承):
继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。
派生类的成员也只能访问基类中的public/protected成员,而不能访问private成员;
派生类的对象不能访问基类中的任何的成员。
(3)protected(保护性继承):
继承时基类中各成员属性均变为protected,并且基类中private成员被隐藏。
三、派生类的构造函数和析构函数
1.派生类的构造函数和析构函数的执行顺序
首先执行基类的构造函数,随后执行派生类的构造函数。
当撤销派生类对象时,限执行派生类的析构函数,再执行基类的析构函数。
2.派生类构造函数和析构函数的构造原则
1)派生类不能继承基类中的构造函数和析构函数。
当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。
格式:
派生类构造函数名(参数表):
基类构造函数名(参数表)
{
2)当派生类中还有对象成员时,其构造函数的一般形式为:
基类构造函数名(参数表),对象成员名1(参数表),……对象成员名n(参数表)
执行顺序:
@基类的构造函数
@对象成员的构造函数
@派生类的构造函数
1.当基类构造函数不带参数时,派生类不一定需要定义构造函数,然而当基类的构造函数哪怕只有一个参数,也要为派生类定义构造函数,甚至所定义的派生类构造函数的函数体可能为空,仅仅起到传递参数的作用
2.当基类使用缺省构造函数时或不带参数的构造函数时,则在派生类中定义构造函数时,可以省略:
基类构造函数名(参数表),此时若派生类不需要构造函数,则可以不定义构造函数。
3.如果派生类的基类也是一个派生类,则每个派生类只需负责其直接基类的构造,依次上溯。
四、多重继承
例如用户界面提供的窗口、滚动条、文本框、以及多种类型的按钮,所有这些组件都是由类来支持的,若把这些类中的两个类或多个类合并,则可产生一个新类,例如把窗口和滚动条结合在一起来产生一个可以滚动的窗口,这个可滚动的窗口就是由多重继承得来的。
1.形式:
class派生类名:
派生方式1基类名1,……,派生方式n,基类n
//派生类新增的数据成员和成员函数
二义性错误的消除
使用成员名限定可以消除
如obj.X:
f();
obj.Y:
2.多重继续的构造函数和析构函数
派生类构造函数名(参数表):
基类1构造函数名(参数表),基类2构造函数名(参数表),……
//……
多重继承的构造函数执行的顺序与单继承构造函数的执行顺序相同,既先执行基类的构造函数,在执行对象成员的构造函数,最后执行派生类构造函数的原则。
在过个基类间,则严格按派生类声明时从左到右的顺序来排列先后。
而析构函数则与构造函数的执行顺序相反。
3.虚基类
对于“菱形继承”或“闭合继承”
为使公共基类只产生一个拷贝,可以将这个基类说明为虚基类,这就要求从基类base派生新类时,使用virtual将类base说明为虚基类
classbase1:
virtualpublicbase
1.关键字virtual与派生方式关键字的先后顺序无关紧要,它只说明是“虚拟派生”。
2.一个基类在作为某些派生类虚基类的同时,又作为另一些派生类的非虚拟基类,这种情况是允许存在的。
虚基类的初始化
虚基类的初始化与一般的多重继承的初始化在语法上是一样的,但构造函数的调用顺序不同。
@若在同一层次中包含多个虚基类,这些虚基类的构造函数按对他们说明的先后次序调用
@若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。
@若在同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类构造函数。
五、赋值兼容规则
约定:
类derived是从类base公有派生而来的。
在公有派生情况下,一个派生类的对象可以作为基类的对象来使用。
1.派生类对象可以赋给基类的对象
如:
derivedd;
baseb;
b=d;
2.派生类的对象可以初始化基类的引用
base&
br=d;
3.派生类的对象的地址可以赋给指向基类的指针
base*pb=&
d;
(三)多态
接口与方法分离,一个接口,多种方法。
编译时的多态性:
通过函数重载和运算符重载实现
运行时的多态性:
通过继承和虚函数来实现
一、函数重载
用一个名字访问一组相关的函数,如构造函数的重载。
在基类和派生类中的函数重载有两种情况:
一种是参数有所差别的重载,另一种时函数所带的参数完全相同,只是他们属于不同的类,使用方法如下:
1)使用对象名加以区别
2)使用“类名:
”加以区分
二、运算符重载
通过创建运算符函数operator()来实现。
运算符重载定义了重在的运算符将要进行的操作,这种操作通常作用在一个类上,函数operator()可以是它将要操作的类的成员,也可以不是类的成员。
但非成员operator()函数通常是类的友元函数。
operator@()(@表示所要重载的运算符)。
如果编译器在一个运算符的两边看到自定义的数据类型,就执行用户自己的函数,而不是内部运算法的常规程序。
返回类型operator@(参数列表)
重载运算符与预定义运算符的使用方法完全相同,它不能改变原有运算符的参数个数,也不能改变原有的优先级和结合性。
1.成员运算符函数
语法形式:
classX{
typeoperator@(参数表)
typeX:
operator@(参数表)
//函数体
}
双目:
一个参数;
单目:
无参数
2.友元运算符函数
friendtypeoperator@(参数表);
两个参数;
单目:
一个参数
三、虚函数
1.引入派生类后的对象指针
1)声明为指向基类对象的指针可以指向它的公有派生的对象,但不允许指向它的私有派生的对象
2)允许将一个声明为指向基类的指针指向其公有派生类的对象,但是不能将一个声明为指向派生类的对象的指针指向其基类的对象
3)声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类中定义的成员。
若想访问其公有派生类的特定成员,可以将基类指针用显式类型转换为派生类指针(dynamic_cast)。
2.虚函数的定义和使用
1)虚函数的作用
将成员函数定义为虚函数,就能实现动态调用的功能:
指针指向不同的对象时执行不同的操作。
2)虚函数的定义
就是在基类中被关键字virtual说明,并在派生类中重新定义的函数。
在派生类中定义时。
其函数原型,包括返回类型、函数名、参数个数、与参数类型的顺序。
都必须与基类中的原型完全相同。
虚函数定义的说明
@在基类中,用关键字virtual可以将其public和protected部分的成员函数声明为虚函数
@在派生类中对基类中声明的虚函数进行重新定义时,关键字virtual可以写也可以不写,但是一般都要写上
@虚函数被重新定义时,其函数的原型必须与基类中的函数原型完全相同。
@定义了虚函数后,在main中声明的指向基类的指针op允许指向其派生类,在执行过程中,不断改变它所指向的对象,op->
print()就能调用不同的版本,而这些动作是在运行时动态实现的。
@虽然使用对象名和点运算符和使用类名:
:
可以调用虚函数,但是这种调用是在编译时进行的静态联编,没有充分利用虚函数的特性。
只有通过基类指针访问虚函数时才能获得运行时的多态性
@一个虚函数无论被公有继承多少次,其仍然保持虚函数的特性
@虚函数必须是其所在类的成员函数,不能是友元函数,也不能是静态成员函数,因为虚函数调用要靠特定的对象来决定该激活哪个函数。
但是虚函数可以在另一个类中被声明为友元函数。
@构造函数不能是虚函数,但析构函数可以是虚函数
3.多重继承与虚函数
多重继承可以看成是多个单继承的组合。
因此多继承的虚函数调用与单继承情况下的虚函数调用有相似之处。
4.纯虚函数和抽象类
纯虚函数是一个在基类中说明的虚函数,他在该类中没有定义,但要求在它的派生类中定义自己的版本,或重新说明为纯虚函数。
纯虚函数形式:
virtualtypefunc_name(参数表)=0
例如:
virtualvoidshow_area()=0
如果一个类至少有一个纯虚函数,则称该类为抽象类
说明:
1)抽象类只能用作其他类的基类,不能建立抽象类对象
2)抽象类不能用作参数类型、函数返回类型或显式转换的类型。
但可以声明指向抽象类的指针或引用,此指针可以指向它的派生类,进而实现多态性。
3)如果派生类中没有重新说明虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。
(四)输入输出*
C++内置流
流含义默认设备
cin标准输入键盘
cout标准输出屏幕
cerr标准错误输出屏幕
clogcerr的缓冲版本屏幕
fmtflagssetf(fmtflagsflags);
该函数返回先前的标志并设置flags指定的那些标志。
例:
cout.setf(ios:
showpoint);
showpos);
或者cout.setf(ios:
showpoint|ios:
voidunsetf(fmtflagsflags);
flags指定的标志被清除
uppercase|ios:
scientfic);
cout.unsetf(ios:
uppercase);
fmtflagsflags();
返回当前的标志。
fmtflagsflags(fmtflagsf);
设置某个流的所有标志。
ios:
fmtflagsf=ios:
showpos|ios:
showbase|ios:
oct|ios:
right;
cout.flags(f);
//setallflags
streamsizewidth(streamsizew);
修改最小域宽,w是将要改成的域宽,先前的域宽返回。
streamsizeprecision(streamsizep);
当输出浮点型时,可以使用precision()函数来确定数字的精确位数。
charfill(charch);
填充指定字符,默认情况下是空格
C++操纵函数
操纵函数用途输入/输出
boolapha设置boolapha标志输入/输出
dec设置dec标志输出
endl输出一个换行符并刷新流
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 要点 第二 部分