class
一、类的定义使用关键字class定义一个类,例如:
class Date {
int d, m, y;
public:
void init(int dd, int mm, int yy);
void add_year(int n);
void add_month(int n);
void add_day(int n);
};
上面定义了一个Date类,其中d、m和y称为成员变量,函数称为成员函数。默认情况下,class中定义的成员为private属性,只能由该类的成员函数访问。
二、成员函数的定义
由于不同的类可能具有相同的成员函数名,所以在定义成员函数时,需要指定类的名字,例如:
void Date::add_year(int n)
{
y += n;
}
在成员函数里,类的成员是可以直接使用的,不用显示的指明某个对象。
三、构造函数
构造函数与类同名,可以带参数。构造函数没有返回值,也不能将构造函数返回值声明为void类型,例如,上面类的构造函数声明如下:
class Date {
//...
Date(int, int, int);
//...
};
如果一个类具有一个构造函数,那么该类的所有对象的初始化都将通过该构造函数来完成,例如:
Date today = Date(23, 6, 1983);
Date xmas(25, 12, 1990); // 简写形式
Date my_birthday; // 错误:缺少初始化
Date release1_0(10, 12); // 错误:缺少第3个参数
同其它函数一样,构造函数也支持重载,所以构造函数也可以具有多个。
class Date {
//...
Date(int, int, int);
Date(int, int);
Date(int);
Date();
//...
};
四、析构函数
构造函数用于完成对象的初始化,那么析构函数呢?析构函数用于完成一些清理和释放资源的工作,当一个自动变量离开作用域时,或者当new的一个对象被delete时,析构函数都将被隐式的调用。只有在非常特殊的情况下,用户才需要显式的调用析构函数。析构函数名是在类名前加>上~符号,例如前面类的析构函数定义如下:
class Date {
//...
~Date();
//...
};
五、静态成员
使用static关键字即可,静态成员只有唯一的副本,而不是每个对象都具有一份副本。
class Date {
int d, m, y;
static Date default_date;
public:
Date(int dd = 0, int mm = 0, int yy = 0);
//...
static void set_default(int, int, int);
};
Date::Date(int dd, int mm, int yy)
{
d = dd ? dd : default_date.d;
m = mm ? mm : default_date.m;
y = yy ? yy : default_date.y;
}
静态成员(包括静态变量和静态函数)都必须在某个地方另行定义,静态成员变量和函数定义如下:
Date Date::default_date(16, 12, 1770);
void Date::set_default(int d, int m, int y)
{
Date::default_date = Date(d, m, y);
}
另外,访问静态成员不必提及任何对象,相反,应该给成员名前加上类的名字,例如:
void f()
{
Date::set_default(4, 5, 1945);
}
六、结构和类
struct也可以定义类,但是成员默认为public,这是和class最大的区别。以下两个类完全等价:
class Date1 {
int d, m, y;
public:
Date1(int dd, int mm, int yy);
void add_year(int n);
};
struct Date2 {
private:
int d, m, y;
public:
Date2(int dd, int mm, int yy);
void add_year(int n);
};
七、在类里面的函数定义
如果函数定义在一个类里面,而不仅仅是声明,它默认为一个inline函数。例如:
class Date {
public:
int day() {return d; }
// ...
private:
int d, m, y;
};
当然定义inline函数还不只这一种方法,也可以将函数定义在类外面,同时在返回值类型前加上inline关键字就可以将该函数定义成inline函数,例如:
class Date {
public:
int day();
// ...
private:
int d, m, y;
};
inline int Date::day()
{
return d;
}
上面定义的两组函数完全等价,都是inline函数。