类定义
1 | class 类名 |
例子:
日期类的说明:1
2
3
4
5
6
7
8
9class TDate
{
public:
void SetDate(int y, int m, int d);
int IsLeapYear();
void Print();
private:
int year,month,day;
};
日期类的实现部分如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14void TDate::SetDate(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
int TDate::IsLeapYear()
{
return (year%4 == 0 && year%100 != 0) || (year%400 == 0);
}
void TDate::Print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
注意事项
- 类体中不允许对所定义的数据成员进行初始化
类中的数据成员的类型可以是任意的,包含int,float,char,数组,指针和引用等,也可以是对象。另一个类的对象可以作为该类的成员,但是自身类的对象是不可以的,而自身类的指针或者引用是可以的。当一个类的对象作为这个类的成员时,如果另一个类定义在后面,则需要提前说明,这种说明称为引用性说明。
1
2
3
4
5
6
7
8
9
10
11
12
13
14class N;
class M
{
public:
...
private:
N n;//n是N的对象
};
class N{
public:
...
private:
...
};一般在类体中先说明公有成员,这是用户所关心的;后说明私有成员。一般按照类型的大小从小到大说明,这样可以提高空间利用效率。
- 通常习惯将类定义的说明部分放到一个头文件中。
对象
对象定义
1 | 类名 对象名的列表; |
例子:1
TDate data1, date2, *Pdate, date[10];
对象成员的表示方法
1 | //一般对象的成员表示 |
例子:1
2
3
4
5
6
7date1.year,date1.month
date1.SetDate(int y, int m,int d)
//指针
Pdate->year,Pdate->month
(* Pdate).year
Pdate->SetDate(y,m,d)
(* Pdate).SetDate(y,m,d)
对象初始化与回收
对象定义完了之后就是对象的初始化了。
初始化主要是通过类中的初始化函数完成的。这个初始化函数叫构造函数
。
对象用完之后的回收用的是类定义中的反初始化函数,叫做析构函数
。
构造函数特点
- 构造函数是成员函数,函数体可以写在类体内,也可以写在类体外
- 构造函数是一个特殊的成员函数,该函数的名字与类名相同,函数不指定返回值类型。它有返回值,该值由系统内部使用。该函数可以没有参数,也可以有参数。
- 构造函数可以重载,即可以定义多个参数个数不同的函数。
- 程序中一般不直接调用构造函数,在创建对象时系统自动调用构造函数。
析构函数的特点
- 析构函数是成员函数,函数体可以写在类体内,也可以写在类体外
- 也是一个特殊的成员函数,名字与类名相同,并在前面加一个
~
字符。用于与构造函数加以区别。不指定数据类型,并且没有参数 - 一个类中只能有一个析构函数
- 通常由系统自动调用。下面两种情况下,析构会自动调用
- 如果一个对象呗定义在一个函数体内,则当这个函数结束时,即该对象结束生存,系统调用析构释放该对象
- 如果一个对象是使用new运算符被动创建的,则在使用delete运算释放它时,delete将会调用析构
默认构造函数与默认析构函数
没有参数的构造函数成为默认构造函数。
- 一种是系统默认的
- 一种是程序员自己定义的
创建对象时都要调用构造函数进行对象初始化。
复制构造函数
复制构造函数
是用一个已知的对象来创造另一个对象,而新对象与已知的对象的数据成员的值可以相同,也可以不同。
复制构造函数除了具有之前讲过的带参构造函数的特性外,它只有一个参数,并且是对象引用。
格式如下:1
2
3
4类名::复制构造函数名(类名
{
函数体
};
如果一个类中没有定义复制构造函数,系统会自动提供一个默认的复制构造函数,作为该类的公有成员,用来根据已知对象创建与其相同的新对象。
以下3中情况会调用复制构造函数来由一个对象初始化另一个对象。
- 1.明确表示由一个对象初始化另一个对象时
- 2.当对象作为函数实参传递给函数形参时
- 3.当一个自动存储类对象作为函数返回时
1
2
3
4
5
6//1.
TPoint P2(P1);
//2.
P=f(N);
//3.
return R;