类是在结构体的基础上发展而来的。
类的说明语句的一般形式为:
class <类名>
{
public:
公有段数据成员和成员函数(公有成员是类的接口,在类中和类外可见)
protected:
保护段数据成员和成员函数(保护成员在类和它的派生类中可见)
private:
私有段数据成员和成员函数(私有成员只能在类中可见,不能在类外或它的派生类中可见,若私有成员放在第一段,则可以省略关键字private)
}
例如,一个日期类的说明如下:
class Date
{
public:
void SetData(int y,int m,int d);
int IsLeapYear(); //判断是否是闰年
void PrintData();
private:
int year,month,day;
};
Data类的成员函数在类外写为:
void Data::SetData(int y,int m.int d)
{
year=y;
month=m;
day=d;
}
int Data ::IsLeapYear()
{
return(year%4==0&&year%100!=0||year%400==0);
}
void Date::PrintData()
{
cout<<year<<","<<month<<","<<day;
}
简单的成员函数实现可以在类中定义,此时,编译器作为内联函数处理。
对象成员的使用方式与结构相同
对象成员的访问形式与访问结构的形式相同,运算符"."和"->"用于访问对象成员
this指针
当一个对象调用类的数据成员时,对象的地址被传递给this指针,即this指针指向了该对象。this指针是一个隐含指针,不能显式说明,但可以在成员函数中显式使用
Tclass的成员函数print可以这样写:
void Tclass::print()
{
cout<<this->x<<","<<this->y<<endl;
}
this指针的显式使用主要在运算符重载、自引用等场合。
this指针是一个长指针,相当于:
class_Type* const this;
其中,class_Type是用户定义的类类型标识符。
构造函数
构造函数名与类名相同。可以有任意类型的参数,但不能有返回值。构造函数在建立类对象时自动调用。
析构函数
与构造函数对应的时析构函数。析构函数是在类名前冠以一个波浪号"~",析构函数没有参数,也没有返回类型,析构函数在类对象作用域结束时自动调用。
以日期类为例
Date::Date(int y,int m,int d) //构造函数
{
year=y;
month;
day=d;
}
Date::~Date() //析构函数
{}
重载构造函数
构造函数允许重载,以日期类为例
class Date
{
public:
Date();
Date(int);
Date(int int);
Date(int int int);
~Date();
}
复制构造函数
创建对象时,有时希望用一个已有的同类型的数据对它进行初始化。C++可以完成类对象数据的简单复制。用户自定义的复制构造函数用于完成更为复杂的操作。
格式:类名::类名(const 类名 const 引用名)。
常对象
在定义类的说明语句中以const作前缀,则该对象称为常对象,该对象的全部数据成员在作用域中约束为只读。
常成员函数
定义时以const作为后缀,const成员函数的函数体代码不能修改this所指对象的成员。
静态数据成员
当数据成员冠以static时,称为静态成员。“静态“是指它的作用域局部于类。
一般数据成员在说明对象时建立内存,但static数据成员的存储空间的建立不依赖于对象,即不论创建多少对象,都不会创建static数据成员的存储空间。
静态成员函数
当一个函数冠以static声明时,称为静态成员函数,它没有this指针,因为它只能访问类的静态数据成员。
感悟:编写类程序时要循序渐进,编译一处运行一处,切忌一次性全部写完,其次,在写代码前先要有一个清晰的思路,形成一个清晰的框架。