C++开发初级


899 浏览 5 years, 3 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)之来说明:publicprotected以及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声明分组,并且在这些声明内将方法和数据成员分组。