类和对象的定义
类是生成对象的模板,而对象是类的具体实例。例如,学生"张三"和学生"李四"是按类"Student"这个模板生成的两个具体的对象。
类的定义
1.类的声明
在C++中,类的声明形式如下:
class 类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护成员
} ;
其中,public,private和protected是类成员的访问控制,类的成员分为数据成员和函数成员。
例1:声明Point类
class Point{
public:
void setPoint(int initX,int initY){//设置点坐标
x = initX;
y = initY;
}
int getX()
{
return x;//获得点的x坐标
}
int getY(){
return y;
}
private:
int x,y;
};
2.类成员的访问控制
C++中,类成员的访问控制方式有3种:公有类型(public),私有类型(private)和保护类型(protected).
(1)公有类型
公有类型在关键字public后面声明,它们是类与外部的接口。任何外部函数都可以访问公有类型的数据和函数。
(2)私有类型
私有类型在关键字private后面声明,只允许本类中的函数访问,而类外部的任何函数都不能访问。如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。
(3)保护类型
保护类型与private类似,其差别表现在继承和派生的时候对派生类的影响不同。
3.类的数据成员
类的数据成员与一般的变量声明相同,但需要将它放在类的声明体中。在类的成员互相访问时可以直接使用成员名。
4.类的函数成员
函数的原型必须在类中声明,函数体实现可以在类中直接给出,以形成内联成员函数;也可以在类外给出,但需要在函数名前使用类名加以限定。允许声明重载函数和带默认形参值得函数。
例2 在类外给出函数体实现
class Point{
public:
void setPoint(int initX,int initY);//设置点坐标
int getX();
int getY();
private:
int x,y;
};
void Point::setPoint(int initX,int initY){
x = initX;
y = initY;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
为了提高运行时得效率,对于较为简单的函数可以将其声明为内联函数形式。内联函数体中不要复杂结构(如循环语句和switch语句)。在类中声明内联函数有两种方式:第一种是将函数体放在类的声明中;第二种是类外使用inline关键字。
/*用inline声明内联函数*/
class Point{
public:
void setPoint(int initX,int initY);
int getX();
int getY();
private:
int x,y;
};
inline void Point::setPoint(int initX,int initY){
x = initX;
y = initY;
}
inline int Point::getX(){
return x;
}
inlint int Point::getY(){
return y;
}
对象的定义
类的对象是该类的某一特定实体,即该类型的变量,其声明形式如下:
类名 对象名;
例如:
Point p1,p2;
对象访问类中的成员,属于类的外部访问,只能访问public属性的成员,访问方式是:
对象名.成员名
例如:
p1.getX()
'.'操作符指出调用所针对的对象。
完整的类与对象例子:
#include <iostream>
using namespace std;
class Point{
public:
void setPoint(int initX,int initY);
int getX();
int getY();
private:
int x,y;
};
void Point::setPoint(int initX,int initY){
x = initX;
y = initY;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
int main(void)
{
Point p1,p2;
p1.setPoint(30,50);
p2.setPoint(10,20);
cout<<"p1的坐标:"<<p1.getX()<<","<<p1.getY()<<endl;
cout<<"p2的坐标:"<<p2.getX()<<","<<p2.getY()<<endl;
return 0;
}
运行结果如下: