二、类与对象
一.类的定义
为了以后的笔记方便就把.h文件与.cpp文件合并。
1.访问权限:能不能访问该类中的成员
①Public
②Protected
③Private

声明:
在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。
在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。
2.成员变量(属性)
3.成员函数(方法)
①构造函数
构造函数的调用是强制性的,一旦在类中定义了构造函数,那么创建对象时就一定要调用,不调用是错误的。如果有多个重载的构造函数,那么创建对象时提供的实参必须和其中的一个构造函数匹配;反过来说,创建对象时只有一个构造函数会被调用。
作用:对成员变量进行初始化
a.默认构造函数
程序中自己不定义构造函数,那必然有一个默认的构造函数将对成员变量进行初始化

b.程序员定义的构造函数(无参、有参)

c.构造函数的重载:在创建对象时根据传递的实参来判断调用哪一个构造函数。


②普通成员函数
二.对象的创建及访问类中的成员
创建对象时就一定要调用构造函数,不调用是错误的。
1.普通对象
格式:类 对象名;
例:Date a;
2.指针对象
①在栈上创建对象
创建的对象在栈上分配内存,需要使用&获取它的地址
类 对象名;
类 *指针名 = &对象;
例:Date a;
Date *p = &a;
②在堆上创建动态对象
使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。
类 *指针名 = new 类;
Date *p = new Date;

3.对象数组
用构造函数对象数组中的每个元素进行初始化。具体哪些元素用哪些构造函数初始化,取决于定义数组时的写法;(也可以这么理解:对象数组的初始化通常也是由构造函数来完成的)
① 类 对象数组名[数组元素个数];
例:Date a[2] = {Date(),Date()};

②Date *p[3] = {new Date(),new Date(1),new Date(55,88)}


4.对象引用
类 对象名;
类 & 引用名 = 对象;
例:Date a;
Date & r = a;

三.类成员的修饰符
1.const修饰符
①const修饰类的成员变量
不能在类里直接初始化const成员变量,const成员变量属于某个对象,不同对象const数据成员的值可能不同
const修饰类成员变量只能在类的构造函数的初始化列表中进行初始化

②const修饰类的成员函数
const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。

③const修饰对象
const 可以用来修饰对象,称为常对象。一旦将对象定义为常对象之后,就只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)了。
语法
定义常对象的语法和定义常量的语法类似:const class object(params);
可以定义 const 指针:const class *p = new class(params);
class为类名,object为对象名,params为实参列表,p为指针名。两种方式定义出来的对象都是常对象。

2.static修饰符
static可以修饰类中的成员变量(属性)与成员函数(方法);可以实现同一类对象之间的数据共享,static修饰过的成员属于类,不属于某个具体的对象。
①static修饰成员变量(统计案例典型)
声明 static 类 变量名 例:static int count;
初始化 必须在类体外部
类 对象的类::变量名 = xxx; 例: int student::count = 10;

②static修饰成员函数
在C++中,静态成员函数的主要目的是访问静态成员。getTotal()、getPoints() 当然也可以声明为普通成员函数,但是它们都只对静态成员进行操作,加上 static 语义更加明确。

四.对象成员
一个类的对象是另一个类的成员变量;
类名::构造函数名(参数表): 成员变量1(参数表), 成员变量2(参数表), ...
{
//TODO:
}
对于基本类型的成员变量,“参数表”中只有一个值,就是初始值,在调用构造函数时,会把这个初始值直接赋给成员变量。
但是对于成员对象,“参数表”中存放的是构造函数的参数,它可能是一个值,也可能是多个值,它指明了该成员对象如何被初始化。


