1.一个类是指一个模板、蓝图或约定,定义了对象具有什么样的数据域和函数。
一个类具有唯一的身份、状态和行为。
状态(state):一个类的状态用数据域以及它们的当前值来表示。
行为(behavior):一个类的行为由一组函数定义。
相同类型的对象用一个通用的类来定义。
2.实例
一个对象就是类的一个实例。创建一个实例称为实例化(instantiation)。术语中的“对象”和“实例”通常是可以相互交换的。
3.在一个C++类中,用变量定义数据域,用函数定义行为。
4.UML图(Unifined Modeling Language,统一建模语言)/简称类图
+ 表示公有域public(public表示所有的数据域、构造函数和普通成员函数都可以通过类对象来访问)
- 表示私有域private
5.定义类和创建对象
class Circle
{public:
double radius; //数据域
Circle() //构造函数(初始化对象)
{ radius=1;}
Circle(double newRadius)
{ radius=newRadius;}
double getArea() //函数
{return radius*radius*3.14159;}
};
★静态生成对象,不需要用new;动态生成对象,需要用new。
★Circle 类(定义),不要忘记在末尾加分号;
(1)创建对象:
Circle circle1(1.0);
Circle circle2(25);
Circle circle3(125);
(2)访问数据域:circle1.radius
(3)调用函数:circle1.getArea()
6.构造函数
构造函数的名字必须与类名相同;
构造函数没有返回类型--即便void也不可以;
在创建对象时,构造函数被调用,它的作用就是初始化对象;
与一般函数相同,构造函数可以被重载(即可以有多个同名的构造函数,但它们的函数签名不同)
构造函数:
Circle()
{ radius=1;}
Circle(double newRadius)
{ radius=newRadius;}
7.数据域的初始化
(1)数据域不能在声明的时候初始化一个变量(无论局部还是全局变量)可以在一条语句中完成声明和初始化,但作为一个类成员,数据域是不能在声明的时候进行初始化的。
数据域的初始化靠构造函数。
(2)在构造函数中,可以使用初始化列表来初始化数据域:
Circle::Circle()
:radius(1)
{
}
等价于:
Circle::Circle()
{
radius=1;
}
8.创建和使用对象
(1)创建对象时会调用构造函数
使用无参构造函数创建一个对象:ClassName objectName;
使用有参构造函数创建一个对象:ClassName objectName(argument);
eg:Circle Clrcle1;
Circle Circle2(5.5);
(2)使用点运算符(.)即:对象成员访问运算符(object member access operator),来访问对象的数据及调用对象的函数。
数据域radius被称为实例成员变量(instance member variable)或实例变量(instance variable)
函数getArea被称为实例成员函数(instance member function)或实例函数(instance function)
★定义一个类时,首字母大写(C++库中类名都是小写形式,这样易于区分两种不同的类)
(3)一个类就是一个数据类型;
可以使用赋值运算符=来进行对象间内容的复制;eg: circle1=circle2;
数据是储存在对象中的,但函数不是,因为函数是这个类所有对象共享的,编译器仅仅创建一份拷贝就可以了。
9.创建匿名对象(anonymous object)
我们可能需要创建一个对象,却只使用一次。对于这种情况,无须为对象命名。
使用无参构造函数创建一个匿名对象: ClassName()
使用有参构造函数创建一个匿名对象: ClassName(argument)
cout<<"Area is"<<Circle().getArea()<<endl;
cout<<"Area is"<<Circle(5).getArea()<<endl;
10.c++允许将类的定义和实现分离。类定义简单列出所有的数据域、构造函数原型和函数原型,类实现给出构造函数和成员函数的实现,两者可以置于两个分离的文件中。
类定义的扩展名为.h;
类实现的扩展名为.cpp
★符号::称为二元作用域解析运算符(binary scope resolution operator),指明了类成员的作用范围。
★每个构造函数和函数之前的Circle::告知编译器这些函数是定义在Circle类中的。
Circle.h
class Circle{
public:
double radius;
Circle();
Circle(double);
double getArea();
};
Circle.cpp
Circle::Circle()
{radius=1;}
Circle::Circle(double newRadius)
{ radius=newRadius;}
double Circle::getArea()
{return radius*radius*3.14159;}
11.避免多次包含
#ifndef CIRCLE_H //判断是否已经定义
#define CIRCLE_H
#endif //指出头文件结束
12.类中的内联函数(不鼓励用内联函数,因为是用空间换取时间的手段)
如果一个函数是在类定义内实现的,那么它自动成为一个内联函数;
class A
{
public:
A()
{
//Do something
}
double fl()
{
//Return a number
}
double f2();
};
double f2();//函数仅仅定义没有实现
为类定义为内联函数----在类的实现文件中指明成员函数是内联函数。
inline double A::f2()
{
//Return a number
}
13.数据域封装(data field encasulation)
private关键字,将数据域声明为私有的数据域。
为了使私有数据域可以被访问,可定义一个get函数返回数据域的值;
为了使私有数据域可被修改,可提供一个set函数为数据域设置新值。
get函数:
returnType getPropertyName()
返回类型是bool类型的get函数:
bool isPropertyName()
set函数:
void setPropertyName(dataType propertyValue )
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle
{
public:
Circle();
Circle(double);
double getArea();
double getRadius();
void setRadius(double);
private:
double radius;
};
#endif
数据域是私有的,私有数据只能在定义它的类的内部访问。
int main()
{
Circle circle1;
Circle circle2(5.0);
cout<<"The area of the circle of radius"<<circle1.getRadius()<<"is"<<circle1.getArea()<<endl;
circle2.setRadius(100);
cout<<"The area of the circle of radius"<<circle2.getRadius()<<"is"<<circle2.getArea()<<endl;
14.类抽象(class abstraction)
类抽象就是将类的实现和它的使用分离开来。