C++类与对象

���Ľ�������л�����Ķ�

类定义

1
2
3
4
5
6
7
class 类名
{
private:
//数据成员或者成员函数的声明
public:
//成员函数或者数据成员的说明
};

例子:
日期类的说明:

1
2
3
4
5
6
7
8
9
class 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
14
void 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
    14
    class N;
    class M
    {
    public:
    ...
    private:
    N n;//n是N的对象
    };
    class N{
    public:
    ...
    private:
    ...
    };
  • 一般在类体中先说明公有成员,这是用户所关心的;后说明私有成员。一般按照类型的大小从小到大说明,这样可以提高空间利用效率。

  • 通常习惯将类定义的说明部分放到一个头文件中。

对象

对象定义

1
类名 对象名的列表;

例子:

1
TDate data1, date2, *Pdate, date[10];

对象成员的表示方法

1
2
3
4
5
6
//一般对象的成员表示
对象名.成员名
对象名.成员名(参数列表)
//指针对象的指针成员表示
对象指针名->成员名
对象指针名->成员名(参数列表)

例子:

1
2
3
4
5
6
7
date1.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;
0%