C++语言特征

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)"<

相关文档
最新文档