Одной из основных черт C++, которой нет в С, является концепция классов. По существу, классы - самое важное понятие в C++. Классы похожи на
структуры языка С. Однако структура С определяет только данные,
ассоциированные с этой структурой. Вот пример структуры С:
- struct CIRCLE
{
int radius;
int color;
{;
После того как вы объявили структуру, вы можете использовать ее в пределах вашей функции main (), как показано ниже:
- void main()
CIRCLE MyCircle;
...
...
MyCircle.radius = 18;
MyCircle.color = 255; // 255 задает цвет
...
...
}
Со
структурой MyCircle (представляющей окружность) ассоциируются данные
radius и color (радиус и цвет). Класс в C++, с другой стороны, имеет как
ассоциированные с ним данные, так и функции. Данные класса называются элементами данных, а функции класса - элементами-функциями. Следовательно, в программе, которая использует классы, можно написать следующий код:
MyCircle.color = 255;
MyCircle.DisplayCircle() ;
Первые
два оператора присваивают значения элементам данных MyCircle radius и
color; третий оператор вызывает функцию-элемент DisplayCircle() для
вывода окружности MyCircle. MyCircle называется объектом класса circle. Ваша программа может объявить другой объект с именем HerCircle класса circle следующим образом:
Следующие операторы присваивают значения элементам данных HerCircle radius и color:
HerCircle.color = 0;
Затем вы можете использовать функцию-элемент DisplayCircie () для вывода окружности HerCircle:
Перед
тем как работать с классом, ваша программа должна его объявить (так же
как перед работой со структурой mystructure вы должны были объявить ее
элементы данных). В данном разделе вы познакомитесь с синтаксисом
объявления класса. Вы будете и дальше практиковаться с классом circle:
public:
Circle () ;
void SetRadius(void) ;
void GetRadius(void) ;
void CalculateArea(void);
int radius;
Объявление класса имеет следующее строение:
class Circle {
...
...
Здесь вы вводите объявление класса
...
...
};
int color;
void SetRadius(void) ;
void GetRadius(void) ;
~Circle () ;
void CalculateArea(void);
Первый и четвертый прототипы выглядят странно. Первый из них является прототипом функции конструктора:
Вы
узнаете о роли конструктора позже в этом разделе, а пока запомните
синтаксис, который используется в C++ для прототипа функции
конструктора. Когда вы записываете прототип конструктора, вы должны
следовать правилам, приведенным ниже:
•
Имя функции конструктора должно совпадать с именем класса, а после него
должны следовать круглые скобки (). Если, например, вы объявляете класс
с именем Rectangle, он должен включать объявление функции конструктора
класса: Rectangle (). Следовательно, объявление класса Rectangle должно
выглядеть так:
{
public:
...
...
private:
...
...
};
• Функция конструктора должна располагаться под ключевым словом
public.
Функция
конструктора всегда возвращает значение типа void (несмотря на то, что
вы не указали его в прототипе). Как вы вскоре увидите, функция
конструктора обычно имеет один или большее число параметров.
Функция деструктора записывается в объявлении класса следующим образом:
(
public:
...
...
~Circle (); //Деструктор private:
...
...
};
Обратите
внимание на символ тильды (~), который предшествует прототипу функции
деструктора. (На большинстве клавиатур вы можете найти символ тильды
слева от клавиши 1.) При записи прототипа функции деструктора соблюдайте
следующие правила:
• Имя функции
деструктора должно совпадать с именем класса и ему должен предшествовать
символ ~. Если, например, вы объявляете класс с именем Rectangle,
именем функции деструктора должно быть ~Rectangle. Следовательно,
объявление класса Rectangle должно выглядеть следующим образом:
class Rectangle
{
public:
...
~Rectangle(); // Деструктор private:
...
...
};
• Функция деструктора не имеет никаких параметров.
Прототипы
функций и объявления элементов данных включаются в объявлении класса в
разделы public (открытый) или private (закрытый). Ключевые слова public и
private говорят компилятору о доступности элементов-функций и данных.
Например, функция SetRadius() определена в разделе public, и это
означает, что любая функция программы может вызвать функцию SetRadius().
Функция CalculateArea() определена в разделе private, и эту функцию
можно вызвать только в коде функций-элементов класса Circle.
Аналогично,
поскольку элемент данных radius объявлен в разделе private, прямой
доступ к нему (для установки или чтения его значения) возможен только в
коде функций-элементов класса Circle. Если бы вы объявили элемент данных
radius в разделе public, то любая функция программы имела бы доступ
(для чтения и присваивания) к элементу данных radius.
В C++ (но не в С) вы можете использовать одно и то же имя для нескольких функций. Например, вы можете объявить две функции с именем SetRadius() в объявлении класса CCircle. Такие функции называются перегруженными функциями.