Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
226 Кб
Скачать
☆

11. Объявление и определение методов класса.

Любой класс в языке С++ состоит из двух частей: объявления и определения. В объявлении класса говорится, каков интерфейс класса, какие методы и атрибуты составляют объекты этого класса. Объявление класса состоит из ключевого слова class, за которым следует имя класса, список наследования и затем в фигурных скобках - методы и атрибуты класса. Заканчивается объявление класса точкой с запятой. Определение класса должно быть только одно, и если класс используется во многих файлах, его удобно поместить в отдельный файл. В остальных файлах для того, чтобы использовать класс Book, например определить переменную класса Book, в начале файла необходимо поместить объявление класса.

12. Вызов членов класса.

class XXX

{

public:

long x1;

int x2;

/*Данные-члены класса.*/

long getVal1() {return x1;}

long getVal2() {return x2*x1;}

/*Функции-члены класса без параметров.*/

int getVal3(int param) {return x2*param;}

char* getVal4(char *str) {return str;}

/*Функции-члены класса с параметрами.*/

static int f1() {return 100;}

static int f2() {return 10;}

static int f3(int param) {return param;}

/* Определение различных статических функций*/

XXX(long val1, int val2){x1 = val1; x2 = val2;}

/*Конструктор.*/

};

void main()

{

XXX q(1,2);/* Определение объекта.*/

XXX* pq = new (XXX);

pq->x1 = 100;

pq->x2 = 100;

/*Определение и инициализация объекта по указателю.*/

long (XXX::*fp_0) ();

/*Указатель на функцию-член класса.*/

long (XXX::*fp_1) () = &XXX::getVal1;

/*

Проинициализированный указатель на функцию-член класса. Его

значение является относительной величиной и равняется значению

смещения функции-члена относительно первого члена класса.

*/

fp_0 = XXX::getVal1;

/*

Инициализация первого указателя. Один и тот же указатель можно

настраивать на различные функции-члены класса. Главное, чтобы у

всех этих функций-членов совпадали списки параметров и возвращаемые

значения функций.

*/

long val_1 = (q.*fp1)();

/*Вызов функции-члена класса по указателю из объекта.*/

long val_2 = (pq->*fp0)();

/*

Вызов функции-члена класса по указателю с помощью указателя на объект.

*/

int (XXX::*fp_3) (int) = &XXX::getVal3;

/*

Проинициализированный указатель на функцию-член класса. С параметрами

типа int.

*/

int val_3 = (q.*fp_3)(6);

/*

Вызов функции-члена класса по указателю из объекта с передачей параметров.

*/

char* (XXX::*fp_4) (char) = &XXX::getVal3;

/*

Проинициализированный указатель на функцию-член класса с параметрами типа int.

*/

char val_4 = (pq->*fp4)("new string");

/*

Вызов функции-члена класса по указателю с помощью указателя на объект.

*/

int (*fp_5) () = &XXX::f1;

/*

Указатель на статическую функцию объявляется без спецификации класса.

Явная спецификация класса необходима лишь при инициализации указателя.

*/

int retval = (*fp_5)();

/*Вызов статической функции по указателю.*/

fp_5 = XXX::f2;

/*

Перенастройка статического указателя. Главное требование - совпадение

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

*/

int (*fp_6) (int) = &XXX::f3;

/*Указатель на статическую функцию с параметрами.*/

int retval = (*fp_6)(255);

/*Вызов статической функции с параметрами по указателю.*/

long (XXX::*px1) = &XXX::x1;

/*Определили и проинициализировали указатель на член класса long*/

q.*px11 = 10;

/*Используя указатель на компоненту класса, изменили значение переменной

x1 объекта q, представляющего класс XXX. */

pq->*px11 = 10;

/*Используя указатель на компоненту класса, изменили значение переменной

x1 объекта, представляющего класс XXX и расположенного по адресу pq. */

}