1.基本概念
面向对象程序设计是利用对象来进行程序设计。一个对象表示现实世界中一个独一无二的实体。例如,一名学生、一张桌子、一个圆等都可以看作对象。一个对象具有唯一的身份、状态和行为。一个对象的状态用数据域以及它们的当前值来表示。一个对象的行为由一组函数定义,对一个对象调用一个函数就是请求对象执行一个任务。
相同类型的对象用一个通用的类来定义。一个类是一个模板或者一个蓝图,它定义了对象具有什么样的数据和函数。一个对象就是类的一个实例,我们可以创建一个类的多个对象。创建一个实例称为实例化。新创建的对象保存在一块内存区域中,当对象创建后,我们可以使用点运算符( . ),也就是所谓的对象成员访问运算符,来访问对象的数据,调用对象的函数。下面是一个例子:
class Circle
{
public:
double radius;
Circle();
{
radius=1;
}
Circle(double newRadius)
{
radius=newRadius;
}
double getArea()
{
return radius*radius*3.14159;
}
};
int main()
{
Circle circle1;
Circle circle2(5.0);
cout<<”The area of the circle of radius”<<circle1.radius<<”is”<<circle1.getArea()<<endl;
cout<<”The area of the circle of radius”<<circle2.radius<<”is”<<circle2.getArea()<<endl;
circle2.radius=100;
cout<<”The area of the circle of radius”<<circle2.radius<<”is”<<circle2.getArea()<<endl;
return 0;
}
程序输出的结果如下:
The area of the circle of radius 1 is 3.14159
The area of the circle of radius 5 is 78.5397
The area of the circle of radius 100 is 31415.9
注意点:
1)在类定义末尾一定要有一个分号(;),union和struct也是如此。
2)一个类成员,数据域是不能在声明时进行初始化的,可以在构造函数中为其赋值。
2.声明和实现分离
C++允许将类的声明和实现分离。类声明描述了类的约定,而类实现则实现了这一约定。类声明简单地列出所有数据域、构造函数原型和函数原型,类实现给出构造函数和成员函数的实现,两者置于两个分离的文件中。两个文件应该使用相同的名字,但具有不同的扩展名。类声明文件的扩展名为.h,类实现扩展名为.cpp。现将上面的例子进行声明和实现的分离。
程序清单 Circle.h
class Circle
{
public:
double radius;
Circle();
Circle(double newRadius);
double getArea();
};
程序清单Circle.cpp
#include “Circle.h”
Circle::Circle()
{
radius=1;
}
Circle::Circle(double newRadius)
{
radius=newRadius;
}
double Circle::getArea()
{
return radius*radius*3.14159;
}
注意点:
1)每个构造函数和函数之前的Circle::是必须的,它告知编译器这些函数是定义于Circle类中的。在C++中,符号::称为二元作用域解析运算符。
2)如果一个函数是在类声明内实现的,那么它就自动地成为一个内联函数。还有另外一种方法将类成员函数声明为内联的,在类实现文件中用inline指明成员函数是内联函数。
3.对象指针与对象数组
1)对象指针
对象名一旦声明后,就无法修改。但是,我们可以创建对象指针,只要需要,任何时候都可以将对象地址赋予指针。例如:
Circle circle1;
Circle *pCircle=&circle1;
通过指针访问对象成员,有以下两种办法。第一种,对指针解引用,然后使用点运算符( . )访问对象成员。第二种,C++提供了一种简写的成员选择运算符,箭头运算符(->)。下面是分别用以上两种方法实现指针访问对象成员的例子:
cout<<”The radius is “<<(*pCircle).radius<<endl;
cout<<”The area is”<<pCircle->getArea()<<endl;
2)对象数组
我们可以创建元素为基本数据类型的数组,同样,我们也可以创建对象数组。例如:
Circle circleArray[10];
这条语句会调用无实参构造函数来初始化数组中的元素。
注意:在声明对象指针时,只是声明了一个指向对象的指针,并不会调用构造函数;而在声明对象数组时,会先调用构造函数来初始化对象元素。
4.变量作用域
在类中,只能为一个数据域声明一个成员变量,但一个变量名可用在多个不同的函数中声明多个局部变量。局部变量在函数内声明,只能在函数内局部使用。如果(成员函数中)一个局部变量与一个数据域具有相同的名字,数据域将被屏蔽,因为局部变量的优先级更高。