Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1207

.pdf
Скачиваний:
2
Добавлен:
08.01.2021
Размер:
271.62 Кб
Скачать

 

 

11

class A {

public:

int i; Func1();}

A:: Func1() { return this->i; } // this - указатель класса A

12

Лабораторная работа 2.

Создание объекта

Для создания объекта (экземпляра данного класса) следует объявить переменную типа указатель на класс, а затем создать объект, выполнив оператор new с указанием используемого конструктора.

Например: A* ca;

ca= new A();

Эти же действия можно записать одним оператором.

Например:

A* ca= new A();

Вложенные классы

Язык С++ допускает использование вложенных классов, то есть внутри тела одного класса содержится объявление других классов.

Например: class A

{

public:

A(void);

~A(void);

class B { // Вложенный класс

B(void) {}; ~B(void) {};

char sStr2[3]; };

};

13

Лабораторная работа 3.

Объектные типы

Тип данных всегда определяет размер памяти, которая будет выделена под переменную данного типа при ее создании.

При объявлении переменной объектного типа (типа класса) создаются переменные члены класса и вызывается конструктор класса. Производные типы на основе классов позволяют получать доступ к членам класса.

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

Hапример:

#include <iostream.h>

class A // Объявление класса A { public: int j1;

A(void);

~A(void);}; void main() {

int A::*pToj = &A::j1;

// Объявление производного типа pToj как указателя на член класса

j1

AjA;

//Объявление переменной объектного типа A

A *pjA = & jA;

//Объявление указателя на эту переменную (объект) int j;

jA.*pToj = 123;

//Присваивание значения переменной jA::j1, используя * j = pjA ->*pToj;

//Получение значения, используя ->*

std::cout << j << "\n";

}

Преобразование объектных типов

Указатель на класс может быть преобразован к указателю на базовый класс в двух случаях:

если базовый класс является доступным и преобразование однозначно; если указано явное преобразование типа указателя.

Например:

class A // А - базовый класс

{public:

14

int a1; int Fa();

};

class B : public A // В - производный класс {public:

int b1; int Fb();

};

B bObj; // Объект типа B A *pA = &bObj;

//Преобразование типа ограничивает

//доступ к членам класса B и

//разрешает доступ только к членам

//базового класса

B *pB = &bObj;

//Нет преобразования типа и

//следовательно разрешен доступ как

//к членам класса B,

//так и к членам класса А.

pA-> Fa ();

//Правильно: вызов функции члена класса A. pB-> Fa ();

//Правильно: вызов функции,

//наследуемой от класса A

//Вызов pA-> Fb (); ошибочен: функция Fb

//недоступна через указатель на базовый

//класс А

15

Лабораторная работа 4.

Метод - член класса может иметь следующие модификаторы доступа: public - общедоступный метод;

protected - метод, доступный только для членов и объектов данного класса и наследуемых классов (наследуемых с модификаторами доступа public или protected );

private - защищенный метод, доступный только внутри класса.

Прототип метода может иметь следующее формальное описание: модификатор_доступа тип_метода имя_метода

(список_параметров);

Объявление метода может иметь следующее формальное описание: модификатор_доступа тип_метода имя_метода

(список_параметров) { тело_метода }

void Fx(void *pV); //Прототип метода

...

piVar=new int; pfVar=new float;

Fx(piVar);

// Вызов метода для

// параметра типа int

Fx(pfVar);

// Вызов метода для

// параметра типа float

...

// Реализация метода

void Fx(void *pV) {*pV=12345;}

Метод, возвращающий указатель, записывается следующим образом: тип *имя_метода(список_параметров).

#include <stdio.h>

//Библиотека, содержащая тип va_list

#include <varargs.h> #include <iostream> int Fx ( int i1, ... );

//Прототип Функции с переменным

//числом параметров

void main( void )

{// Вызов функции Fx с различным

//числом параметров

std::cout<< Fx ( 100, 200) ); std::cout<< Fx ( 5 ) );

16

std::cout<< Fx ( -1,-3,45 ) );

}

int Fx ( int i1, ... )

//Реализация функции с переменным

//числом параметров

{int sumx,i;

sumx = 0; i = i1; va_list list1;

//Список параметров va_start(list1, i1 );

//Инициализация списка параметров while( i != -1 ) {

sumx += i;

i= va_arg(list1, int);

//Извлечение следующего параметра

}

va_end(list1); return( sumx );

}

17

Лабораторная работа 5.

Указатели на методы-члены класса и на функции

Указатели на методы и на функции могут быть использованы для передачи метода в качестве параметра другому методу.

Объявление указателя на метод может иметь следующее формальное описание:

тип_метода (имя_класса::*имя_метода_указателя) (список параметров);

тип_функции (*имя_ функции_указателя) (список параметров);

Инициализация указателя может иметь следующее формальное описание:

тип_метода имя_класса::*имя_метода_указателя (список параметров)= &имя_класса::имя_любого_метода;

тип_функции (*имя_ функции_указателя) (список параметров)= &имя_функции;

Вызов метода, объявленного как указатель на метод, может быть выполнен следующим образом:

(имя_объекта->*имя_ метода_указателя) (список параметров);

(*имя_ функции_указателя)(список параметров);

Для функций, но не для методов - членов класса, разрешена другая форма вызова метода:

имя_ функции_указателя(список параметров); (имя_ функции_указателя)(список параметров);

Объявление функции, имеющей в качестве параметра указатель на метод, может иметь следующее формальное описание:

тип_метода имя_метода (тип_метода_указателя (*имя_метода_указателя)

(список параметров));

Вызов метода, использующего в качестве параметра указатель на метод, может иметь следующее формальное описание:

имя_метода(имя_объекта->*имя_метода_указателя); имя_функции(имя_функции_указателя);

class a1

{

18

public:

 

a1(void);

 

~a1(void);

 

int Fx1(int i1);

 

int Fx2(int i2);

 

};

 

a1::a1(void){}

 

a1::~a1(void){}

 

int a1::Fx1(int i1){

return 1;}

int a1::Fx2(int i2){

return 2;}

int (*Fy_pointer)();

//Объявление указателя на функцию int Fy ();

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

{

a1* a1Object = new a1();

int (a1::*Fx_pointer)(int)=&a1::Fx2;

//Объявление и инициализация указателя

//на метод - член класса

int i; i=(a1Object->*Fx_pointer)(1);

// Вызов по указателю на метод std::cout<<i;

int (*Fy_pointer)()=&Fy;

//Объявление и инициализация указателя

//на функцию

std::cout<<(Fy_pointer)(); std::cout<<(*Fy_pointer)();

//Вызов по указателю на

//функцию (две формы) return 0;

}

int Fy () {return 5;}

19

Лабораторная работа 6.

Встроенные функции

Встроенные функции указываются оператором inline. Применение встроенных функций может несколько сократить время выполнения программы, так как компилятор встраивает код такой функции в том месте программы, где указан ее вызов.

Например:

inline void Fx(void) { std::cout<<"Функция Fx"<<std::endl;}

...

Fx(void);

//Этот код будет заменен компилятором

//на код встроенной функции

Дружественные члены класса

Дружественные члены класса (методы) позволяют получить доступ к защищенным модификатором private членам класса из методов других классов. Методы и классы, объявляемые дружественными, иногда также называются друзьями класса.

Если метод класса A внутри тела класса B объявляется с модификатором friend, что указывает на то, что он является другом класса, то из него разрешен доступ ко всем членам класса B.

Например:

class A { public: int Fx();}

class B { public: friend int A::Fx(); private:

}

Дружественные классы

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

Например:

class A {public: int Fx();} class B {public:

friend class A; private:

}

20

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

Например: class A {public:

//Класс расположен во внешней

//области видимости

int Fx1();

}

namespace classB { class B {public:

friend class A; friend class C; private:

}

class C { public:

//Класс расположен в том же

//пространстве имен int Fx2();

}

}

Дружественные классы не наследуются, и их дружественность не является транзитивной.

Например:

class A {int Fx();}

class B {friend class A;} class C {friend class B;}

//Класс А не является

//дружественным классу C class D : public B {}

//Класс А не является

//дружественным классу D

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]