类的定义和使用
客观世界中的一切事物都可以视为对象。当然这些事物既有具体的物理实体(如:电视,电脑,洗衣机等),也可以是逻辑实体(如:部门、气候等)。不管是哪一种对象他们都有两方面的特征:静态特征和动态特征。所谓对象的静态特征就是能描述对象的一些属性。如一个部门的人数、经理名字等。所谓动态特征就是对象表现出来的行为。比如部门例会,财务汇报和人员出差等。当把一些具有共性的对象归类后形成一个集合(抽象:对事物共性的归纳和集中),也就是所谓的类。所以我们可以这样来描述类和对象之间的关系:类是对象的抽象,对象是累的实例。
类定义的一般形式为:
class类名
{
private:
//私有成员数据和私有成员函数(方法)
protected:
//保护成员数据和保护成员函数(方法)
public:
//公有成员数据和保护成员函数(方法)
};
例1.演示成员访问限定符修饰成员时,成员访问属性的区别
#include<iostream>
usingnamespace std;
classCtest
{
private:
int m_iCount;
protected:
bool m_bFlag;
public:
void PublicFun()
{
cout<<m_iCount<<endl;
}
};
intmain()
{
Ctest test;
//test.m_iCount; //私有成员只能在本类内部访问
//test.m_bFlag; //保护成员只能在本类内部和该类的派生类中访问
test.PublicFun(); //共有成员可以在类的外部访问,也可以在类的内部访问
return 0;
}
例2. 定义一个虫子类,然后实例化一条小虫子,演示使用不同的成员运算符访问对象成员
classCWorm
{
protected:
int m_x,m_y; //保护成员变量, 存储当前屏幕坐标
HBITMAP m_hBmp; //保护成员变量,存储虫子的图片
int m_iDistance; //保护成员变量,保存虫子跑过的距离
void CumDistance(); //保护成员函数,累加虫子跑过的距离
public:
CWorm(); //构造函数,在实例化小虫子时调用
CWorm(int x,int y); //构造函数,在实例化小虫子时调用
void Draw(CDC *pDC); //调用m_hBmp成员变量,把自己画出来
void Move(int x, int y);//请虫子爬行
~CWorm(); //析构函数,在虫子牺牲时调用
};
intmain()
{
//使用'.'成员运算符访问对象的成员
CWorm worm(20,30); //设置好小虫子的初始屏幕坐标,并在构造函数里Load自己的图片
worm.Draw(&dc); //在屏幕上把自己画出来
worm.Move(100,100); //移动小虫子到100,100
worm.Draw(&dc); //在当前坐标再一次画小虫子
//当将一个指针指向对象后,就需要使用'->'运算符访问对象的成员
CWorm *pWorm=new CWorm(20,30);
pWorm->Draw(&dc);
pWorm->Move(100,100);
pWorm->Dram(&dc);
delete []pWorm; //杀死小虫子
return 0;
}
类的成员函数可以访问该类的任何成员(自己访问自己的成员,包括成员函数和成员变量)。
例3. 演示类的成员函数访问同类的成员
#include<iostream>
usingnamespace std;
classCTest2
{
private:
void PrivateFunc()
{
cout<<"Call Privatefunction"<<endl;
}
public:
void PublicFunc(void *pvObj)
{
CTest2 *pTest=(CTest2 *)pvObj;
pTest->PrivateFunc();
}
};
voidmain()
{
CTest2 test1,test2;
test1.PublicFunc(&test2);
}
成员函数的定义既可以在类声明内,也可以分开定义,通常将类声明放在.h文件,类函数定义放在对应的.cpp文件中。
内联的方式:记住如果采用这种在类的内部定义成员函数的函数体的方式,在没有加上inline的时候,这些成员函数自动为内联函数。
classCWorm
{
//...
inline void Move(int x, int y)
{
//.....
CumDistance(x,y);
}
//...
};
分离的方式:在类的外部来定义成员函数的函数体,需要用域运算符::指明该函数属于哪个类,跟普通函数区别开来。
voidCWorm::Move(int x, int y)
{
//......
CumDistance(x,y);
}
注意:一般情况下我们提倡在头文件.h中进行类的声明,在对应的实现文件.cpp中进行类的定义(主要是成员函数的定义)。因为这样可以提高编译效率。举例来说,如果一个工程中有100个地方应用到一个类,需要包括该头文件100次。如果类的声明和定义不分开的话,该文件需要编译100次,如果分开的话只需要编译一次,生成对应的.obj文件即可。如此大大提高编译效率,对象的成员数据和成员函数的存储。对象的成员数据分开存放,但是同一个类的所有对象共享成员函数代码区。成员函数通过this指针区别不同对象的成员数据。