C++语言特征
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、构造函数
1、C++规定构造函数的名字和类名相同,没有返回值。构造函数最重要的作用是创建对象。
2、C++规定,每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。
3、C++又规定,若一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供),这个默认的构造函数是一个不带参数的构造函数。
4、只要类定义了一个构造函数,不管这个构造函数是否带参数,C++就不再提供默认的构造函数。也就是说,若为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,必须自己定义。
5、在创建子类的对象时,先会调用父类的构造函数,然后才会调用子类的构造函数。若父类只有带参数的构造函数而无默认构造函数时,可在子类的构造函数后加一个冒号”:”,然后加上父类的带参数的构造函数,如fish() : animal(400,300)。
二、析构函数
1、当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作就由析构函数来完成。
2、析构函数不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数。
3、对象超出其作用范围,对应的内存空间被系统收回或被程序用delete删除时,析构函数被调用。
4、子类的析构函数先于父类的析构函数被调用。
三、this指针
This指针是一个隐含的指针,它指向对象的本身,代表对象的地址。
四、类、继承
1、抽象类:凡是含有纯虚函数的类叫做抽象类,这种类不能创建对象,只是作为基类为派生类服务。在派生类中必须完全实现基类的纯虚函数,否则派生类也变成了抽象类,不能实例化对象。
提示:在类中定义成员变量时,不能直接给成员变量赋初值。
2、多重继承
多重继承的定义形式为:
Class 派生类名: 访问权限基类名称,访问权限基类名称
{
}
基类名称的说明顺序一般没有重要的意义,除非在某些情况下要调用构造函数和析构函数,初始化是按基类表中的说明顺序进行初始化的,析构函数的调用时按基类表说明顺序的反向进行调用的。
提示:在子类中如果有对基类虚函数的覆盖定义,无论该覆盖定义是否有virtual关键字,都是虚函数。
提示:若在定义派生类(子类)时没有指定如何继承访问权限,则默认为private。
4、子类与父类的转换:子类能被转换成父类,而父类不能转换成子类。如下图所示:Animal 是Fish的父类
五、结构体
在C语言中,结构体不能包含函数,C++的结构体可以包含函数,称为成员函数。
提示:结构体默认情况下,其成员是公有(public)的;类默认情况下,其成员是私有(private)的。
六、多态性
1、重写(覆盖):在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如下例所示:
#include
class animal
{
public:
virtual void breathe()//将函数定义为虚函数,以便实现动态联编
{
cout<<"animal breathe"< } }; class fish:public animal { public: void breathe(){//覆盖父类的breathe方法 cout<<"fish bubble"< } }; void fn(animal *pAn) { pAn->breathe(); } int main() { animal *a[2]; a[0]=new animal; a[1]=new fish; a[0]->breathe();//调用animal::breathe() a[1]->breathe();//调用fish::breathe(),若父类animal的breathe()函数去掉virtual,则调用的是animal::breathe() return 0; } 2、重载 函数的参数类型、参数个数不同,才能构成函数的重载。以下情况不能称做重载: 情况一:返回类型不同,不能构成重载 (1)、void output() (2)、int output() 情况二:函数带有默认参数时,不能构成重载 (1)、void output(int a,int b=5) (2)、void output(int a) 3、隐藏与覆盖: #include class Base { public: virtual void xfn(int i) { cout<<"Base::xfn(int i)"< } void yfn(float f) { cout<<"Base::yfn(float f)"< } void zfn() { cout<<"Base::zfn()"< } }; class Derived:public Base { public: void xfn(int i)//覆盖了基类的xfn函数 { cout<<"Derived::xfn(int i)"<