第九章 对象和类
1.声明类
类定义了对象的属性和行为。
相同类型的对象用一个通用的类来定义。
一个对象是类的一个实例(instantiation)。
构造函数(constructor)在创建新对象时被调用。
UML类图:Unified mondeling Language(统一建模语言)。
类定义末尾需要一个分号";"
作为一个类成员,数据域不能在声明时进行初始化。
2.创建和使用对象
对象的数据域和函数可用对象名通过点运算符(.)来访问。
使用无参构造函数创建(命名)对象的语法:
ClassName objectName;
//注意此处不能有括号。
有参构造函数创建(命名)对象的语法:
ClassName objectName(arguments);
使用无参构造函数创建匿名对象的语法:
ClassName()e;
//注意此处必须有括号。
有参构造函数创建匿名对象的语法:
ClassName(arguments);
实例变量又称实例成员变量,如Circle类中的radius;实例函数又称实例成员函数,如Circle类中的getArea()。
一个类就是一个数据类型。
可以使用赋值运算符=来进行对象间内容的复制。例如:
Circle c1;
Circle c2(1.0);
c1 = c2;
//此时c1和c2是拥有半径相同的两个不同的对象
一个对象往往不像我们想的那样大,它虽然有相应的数据域,也可以调用函数,但其大小只与数据域有关,可以通过函数sizeof(objectName)来查看。
3.类定义和类实现的分离
分离类的定义和类的实现有助于类的维护。
类定义文件的扩展名为.h;类实现文件的扩展名为.cpp。
程序9-1和程序9-2分别给出了类Circle的定义和实现。
程序清单9-1 Circle.h
class Circle
{
public:
Circle();
Circle(double newRadius);
double getArea();
private:
double radius;
};
程序清单9-2 Circle.h
\#include "Circle.h"
Circle::Circle()
{
radius = 1;
}
Circle::Circle(double)
{
radius = newRadius;
}
double Circle::getArea()
{
return radius*radius*3.14;
}
//每个构造函数与函数之前的Cirle::告知编译器这些函数是定义于Circle类中的。
4.避免多次包含
“包含保护”(inclusion guard)可避免头文件被多次包含。
原因:在C++中,预处理器是把头文件的内容插入他们被包含的位置。
方法:
\#ifndef ClassName_H
\#define ClassName_H
A class header for the class named ClassName
\#endif
5.类中的内联函数
6.数据域封装
使用private关键字,将数据域声明为私有的。
7.变量作用域
无论实例变量和静态变量在类的何处声明,他的作用域都是整个类。
虽然类成员可以按照任意顺序声明,但提倡先声明共有成员。
如果成员函数中一个局部变量于一个数据域具有相同的名字,数据域将会被屏蔽,因为局部变量在其所定义的函数中的优先级更高。
8.类抽象和类封装
类抽象:将类的实现和使用分开;
类封装:将类的实现细节封装起来,对用户隐蔽。
建议:在本课程之后的学习中,可以先创建一个类对象,并尝试使用它的函数,再把注意力放到类的实现上。
创建一个类对象,并尝试使用它的函数,再把注意力放到类的实现上。