面向对象的特点:封装、继承、多态
1、类的定义
类定义的一般形式为:class 类名
private :
数据成员或成员函数
protected :
数据成员或成员函数
public :
数据成员或成员函数friend 其他函数或类名
};
<各成员函数的实现代码>
其中,class是定义类的关键字。类名是一个有效的标志符,且一般首字母大写。大括号括起来的部分是类说明部分,它声明了类的所有成员(包括数据成员和函数成员),这些成员从访问权限上分成三类,即私有(private)、公有(public) 和保护(protected),其中默认权限为private。
类的private部分说明的成员,在类之外是不能存取的,只有类中的成员函数才能存取private的数据成员和成员函数。类的public部分说明的成员,可被程序中的任何函数或语句存取,public成员多为成员函数,用来提供一个与外界的接口,外界只有通过这个接口才可以实现对private成员的存取。类的nrotected部分说明的成员,不能在类之外存取,只有类的成员函数及其子类(派生类) 可以存取protected 的成员。
2、成员函数的定义
二是在类的定义体中只写出成员函数的原型说明, 而成员函数的定义写在类的定义之外,这种情况比较适合于成员函数体较大的情况,其定义格式为:
返回值类型类名: :成员函数名(参数说明)
函数体;
}
3、对象成员的访问
第一种格式是利用对象和运算符".'访问成员; 而第二种格式是采用指向对象的指针和运算符 ->”来访问成员,并且第二种格式中的指针变量必须已指向某个对象。
此处的“类型”要与类中数据成员的类型保持一致。
要使已经定义的类数据成员的指针变量指向类中某个数据成员时,可以通过以下语句:
类数据成员指针变量名=&类名: :类数据成员变量名;
在每一个类成员函数的形参表中都有一个隐含的指针变量this,该指针变量的类型就是成员函数所属类的类型。当程序中调用成 员函数时,this指针变量被自动初始化为发出函数调用的对象的地址。
尽管我们在定义成员函数时没有看到this指针变量,也没有定义this指针变量,但是在成员函数的函数体内我们可以使用this指 针变量, 因为该指针变量使系统隐含给出的,我们不需要也不能在成员函数的形参表中对this指针变量进行显示说明。 类中成 员函数有了隐含的指针变量this后,就可以保证用不同的对象调用成员函数是对不同对象的操作。
构造函数是用于创建对象的特殊成员函数,当创建对象时,系统自动调用构造函数。
构造函数的作用是: 为对象分配空间; 对数据成员赋初值; 请求其他资源。
没有用户定义的构造函数时,系统提供缺省版本的构造函数。
构造函数名与类名相同: 类名。
构造函数可以重载。
构造函数可以有任意类型的参数,但没有返回类型。
析构函数的作用是进行对象消亡时的清理工作。
没有用户定义析构函数时,系统提供缺省版本的析构函数。
析构函数名为:~ 类名。
析构函数没有参数,也没有返回类型。
自定义复制构造函数所进行的复制是浅复制。
深复制:通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。
7、常成员
(1) 常数据成员
使用const说明的数据成员称为常数据成员。
如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而任何其他函数都不能对该 成员赋值。
如果在说明对象时用const修饰,则被说明的对象为常对象。
常对象的说明形式如下:
类名const 对象名[(参数表)];
在定义常对象时必须进行初始化,而且不能被更新。
说明:
(1) C++不允许直接或间接更改常对象的数据成员。
(2) C++规定常对象只能调用它的常成员函数、静态成员函数、构造函数(具有公有访问权限)。
在类中使用关键字const说明的函数为常成员函数,常成员函数的说明格式如下:
类型说明符函数名(参数表) const;
const是函数类型的一个组成部分,因此在函数的实现部分也要带关键字const。
常成员函数不能更新对象的数据, 也不能调用非const修饰的成员函数(静态成员函数、构造函数除外) 。
静态数据成员为同类对象共享。
静态成员函数与静态数据成员协同操作。
静态成员不属于某一个单独的对象,而是为类的所有对象所共有。
静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员: 保证在不依赖于某个对象的情况下,访问静态据成员 。
如果在本类(类A) 以外的其他地方定义了一个函数(函数B)
这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数,
在类体中用friend对其(函数B) 进行声明,此函数就称为本类(类A) 的友元函数。
友元函数(函数B) 可以访问这个类(类A) 中的私有成员.
类的包含是程序设计中一种软件重用技术。即定义一个新的类时,通过编译器把另一个类
抄”进来。
当一个类中含有已经定义的类类型成员,带参数的构造函数对数据成员初始化的语法形式:
构造函数(形参表): 对象成员1(形参表),....对象成员n (形参表) ;
初始化顺序: 先初始化被包含的对象成员再初始化本身的数据成员。