|
C++中的类
C++里的封装工具是类,最简单类的定义有点像定义结构,与其他语言不同的是,C++可以在类中定义函数。类的成员可能是函数,也可以是变量,它们分别被称作成员函数和成员变量。实际上,c++也把结构当成特殊的类看待。在使对象之前,首先需要定义类。对象是类的实例。
定义类
简单类
class point
{
int x,y;
};
注意:大括号后面有一个分号,这个分号是不能省的,因为大括号的内容不是复合语句,而是数据定义 。
为了访问类的成员,通过"."或"->"来进行。
point p;
//非指针使用"."
p.x=10;
//指针使用"->"
point *p1;
p1->x=12;
访问控制
public:公有 它的成员变量和函数可以被自由的访问
protected:保护 它的成员不能从外部直接访问,但是可以被派 生类访问。
private:私有 它的成员只能在该类的范围内被访问
构造和析构函数
构造函数是创建对象时首先调用的一个函数,构造函数名必须与类相同,并且不能返回类型寺,但是可以有不同的参数表。
析构函数在对象被销毁时调动,名字必须是"~"+类名,每个类只能有一个析构函数,它既不能有参数,也不能有返回值。
一个类可以有任意多个构造函数,只要它们的参数表不一样,这叫构造函数的重载
使用析构函数的典型例子是在销毁对象的同时释放指针成员所占用的内存。
静态成员
当为一个类定义了成员变量后,每一个类的实例都拥有该变量的拷贝。换句话说,从同—个类构造的两个对象,它们的数据区是不一样的。如果希望所有类的实例都共用一个变量,那么可以使用关键字static定义静态成员变量。
除了静态成员变量,也可以在程序中使用静态成员函数,定义方法同样是使用关键子static。使用了static关键字后,可以调用这些函数而个需要创建类的实例,只需要在类名中加入即可。
实现类
一旦确定了类的接口,剩下的工作就是逐步完成类的成员函数的实现部分。完成类成员函数和完成普通函数没有太大的区别,其特点之一是,实现类的成员函数必须在函数名的加上类名和域操作符"::", 下面是实现类Point的构造函数的例子
Point:oint(int xn,int yn)
{
x=xn;
y=yn;
}
为了正确地使用类,有一套约定俗成的格式:
1.类定义单独保存在以类名为文件名,以".h"为后缀的文件中
2.类的定义部分通常加上"#ifndef...#define...#endif"宏来避免头文件被多次包含
3.类的实现部分保存在以类名为文件名,以".cpp"为后缀的文件中
初始化成员列表
实际中可能出现这种情况:一个类中包含了另外一个类,考虑下面的这个Line类,它使用了前面的Point类
class Line
{
public:
Line(const Ponit &a,const Point &b);
private:
Point start,end;
};
Line::Line(const Point &a,const Point &b)
{
start=a;
end=b;
}
程序在给start,end赋值的时候,首先使用了Point不带参数的缺省构造函数,然后再完成赋值操作,如何能避免绕弯路,直接根据a,b的值构造呢??答案是使用初始化成员列表.
Line::Line(const Point &a,const Point &b):start(a),end(b)
{}
上面的格式保证变量start,end直接从参数a,b构造,为了能够使用这种方式,必须为Point类添加一个成员函八,这个特殊成员函数通常被称为"拷贝构造函数"
class Point
{
public:
Point(int xn=0,int yn=0);
Point(const Point &p)
{
x=p.x;y=p.y;
}
void move(int i,int j);
private:
int x,y:
};
使用初始化成员列表并不局限于这种情况,普通的类成员变量也可以初始化成员列表的方式进行初始化,例如可以这样书写Point类的构造函数:
Point:oint(int xn,int yn)(xn),y(yn)
{} |
|