08 yVal = 0;

09 }

10 Point2D(double x, double у) {

11 xVal = x;

12 yVal = у;

13 }

14 void setX(double x) { xVal = x; }

15 void setY(double у) { yVal = у; }

16 double x() const { return xVal; }

17 double y() const { return yVal; }

18 private:

19 double xVal;

20 double yVal;

21 };

22 #endif

Представленное выше определение класса обычно оформляется в виде заголовочного файла, типичным названием которого может быть point2d.h. В этом примере проявляются следующие характерные особенности С++:

• Определение класса разделяется на секции (открытую, защищенную и закрытую) и заканчивается точкой с запятой. Если не указано ни одной секции, по умолчанию используется закрытая секция. (Для совместимости с языком С в С++ предусмотрено ключевое слово struct, идентичное классу с тем исключением, что по умолчанию используется открытая секция).

• Данный класс имеет два конструктора (один без параметров и другой с двумя параметрами). Если в классе вообще не объявляется конструктор, С++ автоматически добавляет конструктор без параметров и с пустым телом.

• Функции, получающие данные, x() и y(), объявляются как константные. Это значит, что они не будут (и не смогут) модифицировать переменные—члены или вызывать неконстантные функции—члены (например, setX() и setY().)

Указанные выше функции реализовывались бы как встроенные функции, являющиеся частью определения класса. Альтернативный подход заключается в предоставлении в заголовочном файле только прототипов функций и реализации функций в файле .cpp. В этом случае заголовочный файл имел бы следующий вид:

01 #ifndef POINT2D_H

02 #define POINT2D_H

03 class Point2D

04 {

05 public:

06 Point2D();

07 Point2D(double x, double у);

08 void setX(double x);

09 void setY(double у);

10 double x() const;

11 double y() const;

12 private:

13 double xVal;

14 double yVal;

15 };

16 #endif

Реализация функций выполнялась бы в файле point2d.cpp:

01 #include "point2d.h"

02 Point2D::Point2D()

03 {

04 xVal = 0.0;

05 yVal = 0.0;

06 }

07 Point2D::Point2D(double x, double у)

08 {

09 xVal = x;

10 yVal = у;

11 }

12 void Point2D::setX(double x)

13 {

14 xVal = x;

15 }

16 void Point2D::setY(double у)

17 {

18 yVal = у;

19 }

20 double Point2D::x() const

21 {

22 return xVal;

23 }

24 double Point2D::y() const

25 {

26 return yVal;

27 }

Этот файл начинается с включения заголовочного файла point2d.h, потому что прежде чем компилятор будет выполнять синтаксический анализ реализаций функций—членов, он должен иметь определение класса. Затем идут реализации функций, перед именем которых через оператор :: указывается имя класса.

Мы узнали, как можно реализовать встроенную функцию и как можно реализовать ее в файле .cpp. Семантически эти два подхода эквивалентны, однако при вызове встроенной функции большинство компиляторов просто разворачивают тело функции вместо формирования реального вызова функции. Обычно это ведет к получению более быстрого кода, но может увеличить размер приложения. По этой причине только очень короткие функции следует делать встроенными; длинные функции всегда следует реализовывать в файле .cpp. Кроме того, если мы забудем реализовать какую-нибудь функцию и попытаемся ее вызвать, компоновщик «пожалуется» на существование неразрешенного символа.

Теперь попытаемся использовать этот класс.

01 #include "point2d.h"

02 int main()

03 {

04 Point2D alpha;

05 Point2D beta(0.666, 0.875);

06 alpha.setX(beta.y());

07 beta.setY(alpha.x());

08 return 0;

09 }

Перейти на страницу:

Похожие книги