Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие визуального программирования.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆
    1. Методы класса

При вызове методов необходимо связать метод с объектом этого класса [2]. Поэтому имена объектов ( p ) связаны с именем функции (метода) операцией точка (.):

p.InitPoint(10,10);

p.relmove(5,10);

Замечание: Это напоминает доступ к полям структуры.

Вызов методов InitPoint() и relmove() приводило к изменению значений полей x и y. В следующем примере задание значений полей в методе Vvod() будет осуществляться с клавиатуры:

class TPoint

{ private:

int x,y;

public:

void InitPoint ( int newx, int newy)

{

x = newx;

y = newy ;

}

void Vvod()

{

std::cout<<"Vvedi X Y:";

std::cin>> x >> y;

}

. . .

};

Вставим вызов этого метода в главную программу:

int main()

{

TPoint p;// описание объекта

p.Vvod();

std::cout<<"x="<< p.getx()<<",\ty="<< p.gety()<<"\n";

return 0;

}

Результаты работы программы приведены на рисунке 2.2.

Рисунок 2.2. – Результат использования метода Vvod()

Конструкторы

B отличии от предыдущего примера удобнее инициализировать поля объекта автоматически в момент его создания, а не явно, вызовом соответствующего метода. Такой способ реализуется с помощью особого метода класса, называемого конструктором.

Конструктор - это метод, выполняющийся автоматически в момент создания объекта.

Конструктор отличается от других методов:

  1. Имя конструктора совпадает с именем класса;

  2. У конструктора не существует возвращаемого значения.

Заменим метод InitPoint() на конструктор:

class TPoint

{ private:

int x,y;

public:

TPoint(int newx, int newy) // конструктор

{

x=newx;

y=newy;

}

void relmove ( int dx, int dy )

{x+= dx; y += dy ; }

int getx ( void )

{ return x ; }

int gety ( void )

{ return y ; }

};

int main(int argc, char *argv[])

{

TPoint p(10,10); //инициализация объекта р

std::cout<<"x="<< p.getx()<<",\ty="<< p.gety()<<"\n";

. . .

}

В качестве второго примера создадим класс Counter, объекты которого могут хранить количественную меру какой-либо изменяющейся величины.

При наступлении некоторого события счетчик увеличивается на единицу. Обращение к счетчику происходит, как правило, для того, чтобы узнать текущее значение той величины, для изменения которой он предназначен.

#include "stdafx.h"

#include "iostream"

class Counter

{ private:

int count;

public:

Counter ( ):count(0){ } //конструктор

void inc_count ( )//метод увеличения счетчика на 1

{count++; }

int get_count( )//метод возвращает значение счетчика

{ return count; }

};

int _tmain(int argc, _TCHAR* argv[])

{ Counter c1, c2;//создание объектов c1 и c2

std::cout<<c1.get_count()<<std::endl;

std::cout<<c2.get_count()<<std::endl;

c1.inc_count(); c1.inc_count(); //увеличение с1 на 2

c2.inc_count(); //увеличение с2 на 1

std::cout<<c1.get_count()<<std::endl;

std::cout<<c2.get_count()<<std::endl;

return 0;}

Результаты программы приведены на рисунке 2.3.

Рисунок 2.3. – Результаты работы программы

Одной из наиболее часто возлагаемых на конструктор задач является инициализация полей объекта. Инициализация полей обычно реализуется с помощью списка инициализации, который располагается между заголовком и телом функции-конструктора. После заголовка ставится двоеточие. Инициализирующие значения помещены в круглые скобки после имени поля.

Counter ( ):count(0)

{/* тело функции*/ }

Если инициализируются несколько полей, то значения разделяются запятыми.

Деструкторы

Кроме специального метода конструктор, который вызывается при создании объекта, существует другой особый метод, автоматически вызываемый при уничтожении объекта, называемый деструктором [2].

Деструктор имеет имя, совпадающее с именем конструктора, перед которым стоит тильда ~.

class Prim

{ private: int dat;

public:

Prim(): dat(0)

{ }

~Prim()

{ }

};

Наиболее распространённое применение деструкторов – освобождение памяти, выделенной конструктором при создании объекта.

Определение методов может быть реализовано как внутри самого класса, так и вне класса. Во втором случае внутри класса содержится лишь прототип функции, а сама функция определяется позже. Тогда перед именем функции указывается имя класса и символ ::

Вернемся к примеру класса TPoint. Рассмотрим в этом примере реализацию метода relmove()вне класса и добавим деструктор для класса TPoint.

class TPoint

{ private:

int x,y;

public:

TPoint(int newx, int newy)

{x=newx;y=newy; }

void relmove ( int dx, int dy );

int getx ( void )

{ return x ; }

int gety ( void )

{ return y ; }

~Tpoint( ){ }

};

void TPoint::relmove(int dx, int dy)

{x+= dx; y += dy ; }

ЗАМЕЧАНИЯ:

1)Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.

2)Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

3)Деструктор вызывается автоматически, когда объект выходит из области видимости:

• для локальных объектов — при выходе из блока, в котором они объявлены;

• для глобальных — как часть процедуры выхода из main( );

• для объектов, заданных через указатели деструктор вызывается неявно при использовании операции delete.

Деструктор:

• не имеет аргументов и возвращаемого значения;

• не может быть объявлен, как const или static;

• не наследуется;

• может быть виртуальным.

Вернемся ко второму примеру, где был создан класс Counter. При решении разных задач может возникнуть необходимость инициализации счетчика разными значениями, а не только нулем. Для этого создадим еще один конструктор:

class Counter

{ private:

int count;

public:

Counter ( ):count(0)//конструктор, инициализирующий нулем

{ }

Counter (int c): count(c)//конструктор задает любое нач. значение

{ }

void inc_count ( )

{count++; }

int get_count( )

{ return count; }

~Counter( ){} //деструктор

};

int _tmain(int argc, _TCHAR* argv[])

{

Counter c1, c2(3);

std::cout<<c1.get_count()<<std::endl;

std::cout<<c2.get_count()<<std::endl;

c1.inc_count();

c2.inc_count();

std::cout<<c1.get_count()<<std::endl;

std::cout<<c2.get_count()<<std::endl;

return 0;

}

Результат работы программы приведен на рисунке 2.4.

Рисунок 2.4. – Результат работы программы

с разными начальными значениями счетчиков