Методы класса

При вызове методов необходимо связать метод с объектом этого класса. Поэтому имена объектов ( 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()

{

printf("Vvedi X Y:");

scanf("%d%d",&x,&y);

}

. . .

};

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

int main()

{

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

p.Vvod();

printf("x=%d, y=%d\n", p.getx(), p.gety());

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[])

{

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

printf("x=%d, y=%d\n", p.getx(), p.gety());

. . .

}

В качестве второго примера создадим класс 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)

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

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

Деструкторы

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

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

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. – Результат работы программы

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








Дата добавления: 2015-02-10; просмотров: 1063;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.019 сек.