0.1 程序结构
在C++语言中,主要有两种形式的模块。一种是类模块,另一种是函数模块。类和函数都是不能被直接执行,需要一个被称为主函数 的函数来组织整个程序的执行顺序。
0.2 函数
C++中有两种类型的函数:常规函数 和 成员函数 。
常规函数用于完成一个特定的功能;
成员函数用于类方法的定义。
函数的定义 都包括四个部分: 函数名 、形式参数表 、返回类型 、和函数体 。
一般形式为:
返回值类型 函数名 (数据类型 参数1, …, 数据类型 参数n) {
函数体
}
0.2.1函数参数
函数的参数可以分为输入型参数 和 输出型参数 两大类。
C++中函数的参数有四种方式:值参数、常值参数、引用参数和常值引用函数。其中值参数、常值参数和常值引用参数 属于输入型参数 , 引用参数 属于输出型参数 。
0.2.2函数的返回值
函数的返回值属于全局变量。
函数的参数是局部变量。
当成员函数返回值为常值方式时, const表示符使该对象的私有成员不能被改变。
当成员函数返回值为常值方式或常值引用方式时,const标识符一般放在最后。
0.2.3重载
重载就是两个或两个以上的函数(或运算符)使用相同的名字,在函数被调用的时候,编译系统根据调用函数的参数类型或参数个数来确定的被调用函数(不能根据函数的返回值类型重载)。
0.3类
0.3.1访问权限
对类的成员变量和成员函数 进行访问时,其访问权限有三种:私有(private)、公有(public)和保护(protected)。
私有部分中的成员变量和成员函数只能由该类对象的成员函数以及被声明为友元的函数或声明为友元的类的成员函数访问。
0.3.2构造函数和析构函数
构造函数是用来在内存中建立类的具体对象并对其进行初始化赋值的成员函数。
构造函数必须与类的名字相同,没有返回值,所以没有返回值类型。
一个类允许有多个构造函数,但默认的构造函数只有一个。
析构函数 是当对象被撤销时被自动调用的特殊的成员函数。当一个对象被撤销时,析构函数提供了释放该类对象占用空间的方法。
析构函数是在类的名字前面加上~。
析构函数没有返回值, 所以没有返回值类型。
每一个类只能有一个析构函数。
0.3.3运算符重载
运算符重载时必须满足:
(1)运算符必须满足运算优先级和结合律,参数满足相应的运算符对操作数个数的要求。
(2)C++中所有运算符都可以被重载,但是逗号运算(,)和条件表达运算(?:)不可以被重载。
(3)运算符重载时不允许参数有默认赋值。
(4)当重载运算符左边的对象是属于类B,右边的对象是属于类A时,该重载的运算符应定义为类A的友元;否则类B的对象不能操作类A对象中的成员变量。
0.3.4友元
在C++中,一个类的友元可以存取这个类的私有部分
一个类的友元不仅可以是其他类的成员函数,还可以是外部函数或其他类。当类A的友元是类B时,类B中所有的成员函数均可存取类A的私有部分。
0.3.5分辨符
类成员函数名前的符号::称为分辨符。
分辨符指定了成员函数所属的类。当类的定义部分与实现部分不在一个文件中时,在实现部分的成员函数名前使用分辨符是必需的,否则系统无法知道该成员函数属于哪个类。
0.3.6内联函数
C++类成员函数的实现部分包括在定义部分的称为内联函数。
编译系统在遇到内联函数时会把其实现部分的所有语句直接插入到调用程序中,减少了与函数调用和参数传递的系统开销,但是增加了函数调用的空间开销。
当成员函数的实现部分较长时,通常不把内联函数放在类的定义部分,而是放在类的实现部分,此时要在这样的成员函数头部加标识符inline来标识。
0.3.7派生类和继承性
派生类的继承方式主要有public继承和private继承两种方式。
在public继承方式中,基类的公有成员成为派生类的公有成分,基类的保护成分称为派生类的保护成分;在private继承方式中, 基类的公有成分和保护成分都成为派生类的私有成分。
无论是public继承方式,还是private继承方式,基类的私有成分都是派生类不可访问成分(不可见)。
0.3.8多态性和虚函数
多态性是指 当相同的对象收到不同的消息,或者不同的对象收到相同的消息时产生不同的方法调用的特性。
C++支持两种多态:一种是编译时多态,一种是运行时多态。
编译时的多态性是指在编译时进行确认和绑定。编译时多态是通过重载函数来实现的。重载的函数有两种,一种是在一个类中重载多个成员函数(靠参数的个数和参数的类型不同来进行识别和绑定);另一种是基类成员函数在派生类中的重载(也可以靠参数的个数和参数的类型来识别和绑定,当参数的个数和参数的类型也相同时,可以使用分辨符——类名::来识别和绑定)。
运行时多态是在运行时才进行识别和绑定。在C++中,这种多态是用虚函数方法来实现的。
虚函数是在基类中被说明为virtual,并在派生类中重新定义的成员函数。系统在识别时,在运行时才决定当前实际调用的是基类中的成员函数还是派生类中的成员函数。可看作是动态重载。
注:当基类中有虚函数时,派生类只能是public继承方式,不能是private继承方式(why???)
0.3.9纯虚函数和抽象类
有些基类只表达一些抽象的概念,并不和具体的事物相联系,但是这些基类又必须为他的派生类提供一个公共接口界面,这样的基类可以定义成纯虚函数。
纯虚函数是在基类中说明的虚函数,在基类中没有定义,但要求任何派生类都要实现各自的实现方法。纯虚函数是在基类的成员函数定义的原型后加上“=0”标志。
包含纯虚函数的类称为抽象类。由于抽象类中包含了没有函数定义的纯虚函数,所以不允许定义抽象类的对象。
在抽象类也可以定义非纯虚函数供派生类继承。
0.3.10虚函数与纯虚函数的对比
(1)虚函数与纯虚函数都用标识符virtual标识, 虚函数有函数体,可被派生类继承;但是纯虚函数没有函数体,并在函数定义原型后加“=0”,必须被派生类实现。
(2)包含虚函数的类被称为抽象类,抽象类中可能不仅仅有纯虚函数,也可以有虚函数,或其他成员函数。抽象类不能实例化对象。
0.3.11结构体
在C++中,结构体的概念与类的概念基本相同,唯一不同之处是结构体中的所有成分都是公有的。