6.1 类的定义
类的定义可以分为两部分:说明部分和实现部分。说明部分说明类中包含的数据成员和成员函数,实现部分是对成员函数的定义。
类定义的一般格式如下:
class<类名>
{
public:
<成员函数或数据成员的说明>
protected:
<成员函数或数据成员的说明>
private:
<成员函数或数据成员的说明>
};
<各个成员函数的实现>
其中class是声明类的关键字;<类名>是要声明的类的名字,必须符合标识符定义规则;花括号表示类的声明范围,其后的分号表示类声明结束。类的成员包括数据成员和成员函数,分别描述类所表达的问题属性和行为。关键字public、portected和private称为访问权限修饰符,它们限制了类成员的访问控制范围。
各个成员函数的实现既可以在类体内定义,也可以在类体外定义。如果一个成员函数在类体内进行了定义,它将不出现在类的实现部分;如果所有的成员函数都在类体内进行了定义,则可以省略类的实现部分。在类体内定义的成员函数都是内联函数。
6.2 类成员的访问控制
类中的成员具有不同的访问权限修饰符。不同的访问权限修饰符限制了类成员的不同访问控制范围。
类中提供了3种访问控制权限:共有(public)、私有(peivate)和保护(proteced)。其中公有类型定义了类的外部接口,任何来自类外部的访问都必须通过外部接口进行;私有类型的成员只允许本类的成员函数访问,来自类外部的任何访问都是非法的;保护类型介于公有类型和私有类型之间,在继承和派生时可以体现出其特点。
类中成员默认的访问权限时私有的
6.3 类的数据成员
类中的数据成员描述类所表达的问题的属性。数据成员在类体中进行定义,其定义方式与一般变量相同,但对数据成员的访问要受到访问权限修饰符的控制。
在定义类的数据成员时要注意以下个问题。
(1)类中的数据成员可以是任意类型,包括整形、浮点型、数组、指针和引用等,也可以是对象。但是要注意,只有其他类的对象时,才可以作为该类的成员,即作为该类的成员对象而存在。自身类的对象是不可以作为自身类的成员存在的,但自身类的指针可以。
(2)在类体内不允许对所定义的数据成员进行初始化。
6.4 类的成员函数
类的成员函数描述类所表达的问题的行为。类中所有的数据成员函数都必须在类体内进行说明。但成员函数的定义即可以在类体内给出,也可以在类外给出。
在类外定义成员函数时在类声明中给出对成员函数的说明,在类外部对成员函数进行定义(但成员函数仍在类范围内)
在类外部定义的成员函数的一般格式是:
<返回类型><类名>::<成员函数>(<参数表>)
{
<函数体>
}
在类体外定义成员函数时要注意必须在成员函数名前加上类名和作用域符(::)。作用域运算符用来标识某个成员属于某个类。
成员函数的两种定义方式之间是有差别的。如一个成员函数的声明和定义都在类体内,那么这个成员函数就是内联函数。如果一个成员函数的声明在类体内,而定义在类体外,这时对该成员函数的调用是按一般函数进行的。如果要将定义在类体外的成员函数作为内联函数处理就必须在成员函数的定义前加上关键字“inline”,以此显示地说明该成员函数也是一个内联函数,
成员函数除了可以定义为内联函数以外,也可以重载,可以对其对其形参设置默认值。
下面几个例子说明了类中的成员函数的特性。
例1 分析下列程序的输出结果
#include<iostream>
using namespace std;
class Test
{
private:
int X, Y;
public:
void set(int x);
void set(int x,int y);
int add(int x);
int add(int x,int y);
int add();
int getx() { return X; }
int gety() { return Y; }
};
void Test::set(int x)
{
X = x;
Y = x * x;
}
void Test::set(int x, int y)
{
X = x;
Y = y;
}
int Test::add(int x,int y)
{
X = x;
Y = y;
return X + Y;
}
int Test::add(int x)
{
X = Y = x;
return X + Y;
}
int Test::add()
{
return X + Y;
}
int main()
{
Test obj1, obj2;
obj1.set(10, 20);
obj2.set(4);
cout << obj1.getx() << obj1.gety() << endl;
cout << obj2.getx() << obj2.gety()<<endl;
int i = obj1.add();
int j = obj2.add(3, 9);
int k = obj2.add(5);
cout << i << endl << j << endl << k << endl;
return 0;
}
例2 分析下列程序的输出结果
#include<iostream>
using namespace std;
class Date
{
private:
int month, year, day;
public:
void set(int y = 2002, int m = 10, int n = 1);
int Is();
void Print() { cout << year << "." << month << "." << day << endl; };
};
void Date::set(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
int Date::Is()
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main()
{
Date date1, date2;
date1.set();
date2.set(2000, 10, 1);
cout << "date1:";
date1.Print();
cout << "date2:";
date2.Print();
if (date2.Is())cout << "date2是闰年" << endl;
else cout << "date2不是闰年" << endl;
return 0;
}
参考《全国计算机等级考试二级教程——C++语言程序设计》