П. 5.5. Реализация методов класса
Хотя функции доступа SetKey() и GetKey() объявлены (строки 7и 8) в Car, они еще не определены. SetKey() и GetKey() обеспечивает открытый интерфейс к закрытым переменным-членам класса. Для каждой функции доступа, наряду с другими методами, объявленными в классе, должна существовать реализация. Реализация – это описание действия функции. Для определения функции-члена необходимо связать имя класса, частью которого является функция-член, с именем функции. Это достигается путем написания имени функции вслед за именем класса с двумя двоеточиями. Два двоеточия называются оператором расширением области видимости.
Итак, реализация (определение) функции имеет следующий формат:
типВозвращаемогоЗначения имяКласса: : имяФункции (списокПараметров)
{
// тело функции
}
Для рассматриваемого примера реализация функций-членов SetKey() и GetKey() имеет вид:
void Car :: SetKey (unsigned short Num)
{
// закрытой переменной-члену присваивается значение,
// передаваемое извне через параметр Num
Key = Num;
}
unsigned short Car:: GetKey( )
{
// возвращение значения закрытой
// переменной Key
return Key;
}
Окончательно имеем:
#include <iostream>
using namespace std;
class Car
{
private:
unsigned short Key;
public:
void SetKey (unsigned short Num);
unsigned short GetKey( );
};
void Car :: SetKey (unsigned short Num)
{
Key = Num;
}
unsigned short Car:: GetKey( )
{
return Key;
}
int main ()
{
Car myZaparozec;
unsigned short Pass;
myZaparozec.SetKey (65000);
Pass =myZaparozec.GetKey ( );
cout<<"The key of my automobile is "<<Pass<<endl;
return 0;
}
Результат:
The key of my automobile is 65000
П. 5.6. Конструкторы и деструкторы
Объекты имеют собственную специальную функцию-член (метод) – конструктор, задающую начальное состояние объекта при его создании.
Переменные-члены класса не могут получить начальные значения в определении класса, но как и обычные переменные должны быть инициализированы. Инициализация сочетает в себе определение (создание) переменной с присвоением ей начального значения. Для этой цели и служит конструктор.
Для конструктора всегда выполняются следующие правила:
конструктор никогда не вызывается явно, а по своему назначению используется в основном для инициализации полей данных при создании объекта;
конструктор автоматически вызывается при создании объекта класса;
имя конструктора совпадает с именем класса;
от других собственных функций класса конструктор отличается тем, что не имеет возвращаемого значения (даже типа void) – результатом выполнения конструктора является объект;
конструктор может иметь параметры, а следовательно, в классе можно определить несколько конструкторов;
конструктор объекта можно не объявлять, компилятор сам снабдит такой объект стандартными конструктором (и деструктором), стандартный конструктор не принимает аргументов и (вместе со стандартным деструктором) ничего не делает.
важно помнить, что при наличии конструктора, созданного программистом, компилятор не будет создавать свой, но если созданный конструктор получает в виде параметра какое-либо значение, а при инициализации объекта оно не передается, то произойдет ошибка компиляции.
Объявив конструктор необходимо объявить и деструктор. Деструкторы удаляют из памяти отработавшие объекты и освобождают выделенную для них память. Правила деструктора:
деструктору присваивается имя класса с символом тильды «~» впереди;
деструкторы не имеет параметров (не принимают аргументов) и не возвращают значений;
должен быть открытым (public) методом;
никогда не вызывается явно, вызывается автоматически для каждого объекта при выходе из области видимости объекта;
если деструктор не определен в классе явно, то он создается компилятором автоматически, по умолчанию освобождая память, занимаемую объектом.
Рассмотрим небольшой пример класса с конструктором.
#include <iostream>
using namespace std;
class myclass
{
int a;
public:
myclass ( ); // объявление конструктора
void Show ( );
};
// реализация (определение)конструктора
myclass:: myclass( )
{
cout << "In designer \n";
a = 10;
}
// реализация метода
void myclass:: Show ( )
{
cout << a<<"\n";
}
int main ()
{
myclass object; // объявление объекта
object. Show( );
return 0;
}
В этом примере значение a инициализируется конструктором myclass. Конструктор вызывается тогда, когда создается объект object. Объект, в свою очередь, создается при выполнении инструкции объявления объекта, что влечет за собой выполнение записанных в конструкторе действий.
