C++开发初级
1094 浏览 5 years, 11 months
2.1 类定义
版权声明: 转载请注明出处 http://www.codingsoho.com/类定义
下面开始尝试编写一个简单的SpreadsheetCell类,其中每个单元格只存储一个数字:
// SpreadsheetCell.h
class SpreadsheetCell
{
public:
void setValue(double inValue);
double getValue() const;
protected:
double mValue;
};
代码取自 SpreadsheetCellNumOnly\SpreadsheetCell.h
正如前面所讲述的,每个类定义都以关键字class
以及类名称开始。类定义是一条C++语句,因此必须用分号结束。如果类定义结束时不使用分号,编译器将给出几个错误,这些错误消息十分模糊,似乎与缺少分号毫不相干。
类定义所在的文件通常根据类命名。例如,SpreadsheetCell类定义可以放在一个名为SpreadsheetCell.h的文件中。这并不是一个强制规则,您可以用自己喜欢的名称命名文件。
方法和成员
下面两行声明了类支持的方法,这有点像函数原型:
void setValue(double inValue);
double getValue() const;
前面指出过,最好将不改变对象的成员函数声明为const
。
下面这行声明了类的数据成员,看上去有点像变量的声明。
double mValue;
类定义了方法和成员,但这些方法和成员通常只应用于类的特定实例,也就是对象。类定义概念,对象包含实际的位。因此,每个对象都会包含自己的mValue变量值。方法的实现被所有对象共享,类可以包含任意数量的方法和成员。成员与方法不能同名。
访问控制
类中的每个方法和成员都可以使用三种访问说明符(access specifiers)之来说明:public
、protected
以及private
。访问说明符将应用于其后声明的所有方法和成员,直到遇到另一个访问说明符。
在SpreadsheetCell类中,setValue()和getValue()方法是public访问,而mValue成员是protected访问。
类的默认访问说明符是private: 在第一个访问说明符之前声明的所有方法和成员的访问都是私有的。例如,将public访问说明符移动到setValue()方法声明的下方,setValue()方法就会成为私有访问而不是公有访问。
// SpreadsheetCell.h
class SpreadsheetCell
{
void setValue(double inValue); //now has private access
public:
double getValue() const;
protected:
double mValue;
};
代码取自 SpreadsheetCellNumOnly\AccessControl\SpreadsheetCell.h
与类相似,在C中结构(struct)以及共用体(union)也可以拥有方法。实际上,唯一的区别就是结构以及共用体的默认访问说明符是public,而类的默认值是private。例如,SpreadsheetCell类可以用结构重写,如下所示:
struct SpreadsheetCell
{
void setValue(double inValue);
double getValue() const;
protected:
double mValue;
};
下表总结了这三种访问说明符的含义。
访问说明 | 含义 | 使用场合 |
---|---|---|
public | 任何代码都可以访问对象的public方法,或者访问public成员 | 您让客户使用的方法。通过它访问private和protected数据成员方法 |
protected | 类的任何方法都可以调用protected方法,或者访问protected成员。子类的方法可以访调用超类的protected方法或者访问超类的protected成员 | 你不想让客户适用的“辅助”方法。多数(最好是全部)数据成员都应该是protected |
private | 只有这个类的方法可以调用private方法,并且访问private成员。子类中的方法不能访问超类的private方法或者成员 | 只有在限制子类访问的时候才使用 |
声明的顺序
可以以任何顺序声明方法、成员以及访问控制说明符:C++没有施加任何限制,例如方法在成员之前,或者public在private之前。此外,可以重复使用访问说明符。例如,可以这样定义SpreadsheetCell:
// SpreadsheetCell.h
class SpreadsheetCell
{
public:
void setValue(double inValue);
protected:
double mValue;
public:
double getValue() const;
};
代码取自 SpreadsheetCellNumOnly\DeclarationOrder\SpreadsheetCell.h
当然,为了清晰起见,最好将public,protected以及private声明分组,并且在这些声明内将方法和数据成员分组。