类是一个数据类型,可以采用与定义数据类型相同的方式来使用类。
1、 结构
圆点操作符用于指定一个结构变量的成员变量。
结构作为函数参数 对于一个函数来说,可以有结构类型的传值调用参数,以及结构的传引调用参数。函数返回的值也可以具有结构类型。
对结构体进行初始化 在声明一个结构体时可以对其进行初始化,格式如下:
struct Date
{
int month;
int day;
int year;
};
Date due_date={12,31,2004}; 为结构变量赋值,在其后加等号,添加用花括号封闭的一个成员值列表。
2、 类
定义类和成员函数 类是一个数据类型,它的变量就是对象。一个类的定义就是一个数据类型的定义,它描述了两件事情:(1)变量能容纳什么种类的值;(2)成员函数是什么?(类是在结构的基础上添加一些成员函数) 类的定义举例如下;
classDayofYear
{
public:
voidoutput();
intmonth;
intday;
};
......
voidDayofYear::output()
{
cout <<"month= "<<
month
<<", day= "<<
day << endl;
}
在列出成员函数时,只给出了成员函数的声明,只有成员函数的具体定义,在其他地方给出(在C++类定义中,成员变量和成员函数可按任意顺序混合)。一个类类型的对象,在声明时,采用的方式与预定义类型的变量相同,也与结构体变量相同。 定义成员函数时,必须包括类名,因为可能两个或者更多的类具有同名的成员函数。
成员函数调用,使用圆点操作符。成员函数定义时,使用作用域解析操作符“::“,作用与圆点操作符类似。在成员函数定义中,可直接使用哪个类的所有成员(无论是数据成员还是函数成员)的名称,而不必使用圆点操作符。
公共成员和私有成员 定义类,应该严格区分类的使用规则以及类的实现细节。更改一个类的实现时(例如,在一个成员函数的定义中修改某些细节,使函数调用运行得更快),程序的其他任何部分都不应该更改。为此,需要定义数量足够多的函数,确保程序永远都不需要直接访问成员变量(只有成员函数访问成员变量),只需更改成员函数的定义,使之与成员变量改动相匹配,程序中的其他任何东西都不必更改。
私有成员(private) 除非在一个成员函数的定义内,否则无法在程序中直接访问。private: 标签之后的变量成为私有变量,之后的函数成为私有函数。
公有成员(public) 公共成员可以在程序的main主体中使用,或者在任何函数(包括非成员函数)的定义中使用。
定义取值函数和赋值函数 取值函数是用于访问私有成员变量值的成员函数。赋值函数是允许更改私有成员变量值的成员函数。
总结类的特征: 类同时具有成员变量和成员函数; 成员可为公有或者私有; 通常,一个类所有的成员变量都标记为私有成员;
一个类的私有成员只能在同一个类的另一个成员函数的定义中使用; 类的成员函数的名称可以像普通函数一样重载。
在一个类中,可将一个类作为自己的成员变量的类型来使用; 函数的形参可具有类类型;
函数可返回一个对象;换言之,类可以是一个函数返回值的类型。
用于初始化的构造函数 构造函数用于初始化成员变量的值,并进行其他可能需要的任何初始化操作。可以向定义其他任何成员函数那样来定义一个构造函数。但是要注意:构造函数必须与类同名;构造函数定义不能返回值,并且在函数声明的起始处或者函数头中,不允许指定返回类型。例如:
public:
BankAccount(intdollers,intcents,doublerate);
构造函数的声明,名称与类名相同,不知道返回类型
BankAccount(intdollers,doublerate);
BankAccount();
......
BankAccount::BankAccount(intdollers,intcents,doublerate)
{
if((dollers<
0) || (cents< 0) || (rate<
0))
{
cout <<"Illegal value for money or interest
rate\n";
exit(1);
}
balance =dollers+
0.01*cents;
interest_rate =rate;
} 构造函数的定义与一般函数的定义方法相同,只是没有返回值类型
BankAccountaccount1(10,50,2.0);
//对象的声明与初始化
BankAccountaccount2(500,
4.5);
BankAccountaccount3; //声明一个对象,使用无参数构造函数时,不要在对象声明中包括任何圆括号
构造函数是一个类的成员函数,它的名称与类相同。声明类的一个对象时,会自动调用构造函数初始化对象。
构造函数初始化区域 可以在构造函数初始化区域中初始化一个类的部分或者全部成员变量。例如:
BankAccount::BankAccount() :balance(0), interest_rate(0)
{}
初始化区域,在代表参数列表结束的圆括号之后,并在函数主体的起始花括号之前。初始化区域的组成包括一个冒号,后续的以逗号分隔的部分或者全部成员变量的一个列表。在每个区域变量之后,都用一对圆括号来包含它的初始值。
3、 抽象数据类型
数据类型由值的一个集合以及为那些值定义的一系列基本运算构成。如果使用一个数据类型的程序员不能访问值和运算的实现细节,这个数据类型就成为抽象数据类型(Abatract Data Type,ADT)。预定义类型(如int)就是抽象数据类型。
用于生成抽象数据类型的类 类是自己定义的一个数据类型,使用类的程序员不需要关系类的值是如何实现的,为了将类抽象成数据类型,要严格区分程序员使用类型的方式与该类型的实现细节。这样才能对类的实现进行自由的更改。与此同时,使用ADT类的任何程序都不需要进行任何更改,为了达到这个目的,需要遵循以下规则:将所有成员变量都设为类的私有成员; 将用户程序员需要的每个基本操作都设为类的公共成员函数,并完善地指定如何使用每个公共成员函数;
将任何辅助函数都设为私有成员函数。
将类变成ADT之后,最明显的好吃就是在更改实现细节的同时,不需要更改程序的其他部分。另外,编程工作可由不同的程序员来分担,或者将较大的任务分解。