主要内容
C++并不是一种纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型语言。C++面向对象的机制就是为了解决编写大程序时遇到的困难。
面向对象的程序设计有4个主要的特点:抽象、封装、继承和多态性。C++的类对象体现了抽象和封装的特征,在此基础上再利用继承和多态性,就成为真正的面向对象的程序设计。
对象
任何一个对象都应包括两个要素,属性和行为。属性为对象的静态特征,而行为是对象的动态特征。在C++中,每个对象都由数据和函数组成,数据相当于属性,而函数相当于行为。
封装与信息隐蔽
对一个对象进行封装处理,把内部实现和外部行为分隔开,只留下少量接口与外界联系,C++类对象中的函数名就是对象的对外接口,外界可以通过函数名来调用函数实现功能。这样可以大大降低人们操作对象的复杂程度。
利用“封装性”将对象中的某些部分对外隐蔽,这种做法称为信息隐蔽,信息隐蔽有利于数据安全,防止无关的人了解和修改。
抽象
抽象的作用是表示同一类事物的本质。类是对象的抽象,对象是类的具体实例,即类的具体表现形式。
继承与重用
举个例子,如果已经跟人介绍了什么是“马”,那么再跟人介绍“白马”的时候只需说明“白马”是“白色的马”,省去了重新介绍马的过程。“白马”继承了“马”的特征,另外又增加了新的特征。“马”是父类(或称基类),“白马”是从“马”派生来的,称为子类(或派生类)。
C++提供了继承机制,采用继承的方法可以很方便地利用已有类建立一个新的类,这就可以重用软件中的内容,这就是常说的“软件重用”。
多态性
由继承而产生的不同的派生类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。
类的声明
class student
{
public:
void display()
{
cout<<"name:"<<stu[i].name<<endl;
cout<<"rank:"<<stu[i].rank<<endl;
cout<<"average:"<<stu[i].score<<endl;
}
private:
int rank;
char name[5];
double score;
};
需要注意的是,类的定义中系统默认为private,而结构体类型定义中默认为public。
private和public称为成员访问限定符。用它们来声明各成员的访问属性。private声明的成员只能被类中的成员函数或友元类调用。此外还有一种成员访问限定符protected,它声明的成员只能被成员函数或派生类的成员函数调用。
对象的定义方式跟定义结构体类型变量的方式类似。
成员函数
1)类外定义成员函数
class student
{
public:
void display();
private:
int rank;
char name[5];
double score;
};
void student::display() /*“::”是作用域限定符*/
{
cout<<"name:"<<stu[i].name<<endl;
cout<<"rank:"<<stu[i].rank<<endl;
cout<<"average:"<<stu[i].score<<endl;
}
2)内置成员函数
如果在类体中定义成员函数,且函数不包括复杂的控制结构,C++系统会自动对它们作内置函数处理。这样可以大大减少调用成员函数的时间开销。
如果要在类外定义内置函数,只需在前面加上关键字inline。
3)成员函数的存储方式
一个对象所占的内存空间大小只取决于该对象中数据成员所占空间,而与成员函数无关。函数的目标代码是存储在对象空间之外的。
虽然成员函数并没有存放在对象的存储空间内,但从逻辑的角度,成员函数和数据一起封装在一个对象中,只允许本对象的成员函数访问同一对象的数据。
这里就有一个问题,不同的对象调用同一段函数代码,函数代码是怎么对不同对象中的数据进行操作的?
答:C++设立了this指针,调用某对象的成员函数时,this指针就指向该对象,成员函数访问的就是该对象的数据成员。
对象成员的引用与结构体类型变量的引用类似。
类声明和成员函数的定义分离
一个C++程序是由3部分组成的:(1)类声明头文件(后缀为.h);(2)类实现文件(后缀为.cpp),它包括成员函数的定义;(3)类使用文件(后缀为.cpp),即主文件。
在系统提供的头文件中只包括对成员函数的声明,而不包括成员函数的定义。只有把成员函数的定义单独放在另一个文件中,单独编译,才能做到不重复编译。
在实际工作中,并不是将一个类声明做成一个头文件,而是将若干个常用的功能相近的类声明集中在一起,形成类库。类库包括两个组成部分:(1)包括类声明的头文件;(2)经过编译的成员函数的定义,它是目标文件.obj。